草庐IT

php - 在Windows 10上的多个PHP版本之间进行切换的同时,在WAMP(WAMP64)中实现CLI PHP的正确方法

coder 2024-06-06 原文

过去只是将wamp php目录放在我的系统环境变量中,如在这里回答:command line locally using wamp。添加或删除WAMP服务器PHP路径(例如;C:\wamp\bin\php\php5.6.40),这或多或少是一个非常简单的环境变量编辑

我现在正在学习WAMP建议不要使用的最新版本(如此处所示:How To Run PHP From Windows Command Line in WAMPServer)。

在该答案中,它显示了一个名为.cmd的聪明的命令行/phppath.cmd程序,该程序是为Linux用户量身定制的。

未经编辑,它看​​起来像这样:

@echo off

REM **************************************************************
REM * PLACE This file in a folder that is already on your PATH
REM * Or just put it in your C:\Windows folder as that is on the
REM * Search path by default
REM * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
REM * EDIT THE NEXT 3 Parameters to fit your installed WAMPServer
REM **************************************************************


set baseWamp=D:\wamp
set defaultPHPver=7.1.9
set composerInstalled=%baseWamp%\composer
set phpFolder=\bin\php\php

if %1.==. (
    set phpver=%baseWamp%%phpFolder%%defaultPHPver%
) else (
    set phpver=%baseWamp%%phpFolder%%1
)

PATH=%PATH%;%phpver%
php -v
echo ---------------------------------------------------------------


REM IF PEAR IS INSTALLED IN THIS VERSION OF PHP

IF exist %phpver%\pear (
    set PHP_PEAR_SYSCONF_DIR=D:\wamp\bin\php\php%phpver%
    set PHP_PEAR_INSTALL_DIR=D:\wamp\bin\php\php%phpver%\pear
    set PHP_PEAR_DOC_DIR=D:\wamp\bin\php\php%phpver%\docs
    set PHP_PEAR_BIN_DIR=D:\wamp\bin\php\php%phpver%
    set PHP_PEAR_DATA_DIR=D:\wamp\bin\php\php%phpver%\data
    set PHP_PEAR_PHP_BIN=D:\wamp\bin\php\php%phpver%\php.exe
    set PHP_PEAR_TEST_DIR=D:\wamp\bin\php\php%phpver%\tests

    echo PEAR INCLUDED IN THIS CONFIG
    echo ---------------------------------------------------------------
) else (
    echo PEAR DOES NOT EXIST IN THIS VERSION OF php
    echo ---------------------------------------------------------------
)

REM IF A GLOBAL COMPOSER EXISTS ADD THAT TOO
REM **************************************************************
REM * IF A GLOBAL COMPOSER EXISTS ADD THAT TOO
REM *
REM * This assumes that composer is installed in /wamp/composer
REM *
REM **************************************************************
IF EXIST %composerInstalled% (
    ECHO COMPOSER INCLUDED IN THIS CONFIG
    echo ---------------------------------------------------------------
    set COMPOSER_HOME=%baseWamp%\composer
    set COMPOSER_CACHE_DIR=%baseWamp%\composer

    PATH=%PATH%;%baseWamp%\composer

    rem echo TO UPDATE COMPOSER do > composer self-update
    echo ---------------------------------------------------------------
) else (
    echo ---------------------------------------------------------------
    echo COMPOSER IS NOT INSTALLED
    echo ---------------------------------------------------------------
)

set baseWamp=
set defaultPHPver=
set composerInstalled=
set phpFolder=

听起来不错,但我取得了一定的成功。
它是如何工作的,是将phppath.cmd文件放入Windows目录中,并在Windows启动时自动加载。

linux-windows转换可能使我有些困惑,但这是我对Windows 10 WAMP64的编辑输出(当前在C:\Windows文件夹中)
@echo off

REM **********************************************************************
REM * PLACE This file in a folder that is already on your PATH
REM * Or just put it in your C:\Windows folder as that is on the
REM * Serch path by default
REM * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
REM * EDIT THE NEXT 3 Parameters to fit your installed WAMPServer
REM * for example I installed WAMPServer on the D: drive you may
REM * have used C:
REM * - baseWamp : is the drive and folder where you installed WAMPServer
REM * - defaultPHPver : is the version of PHP that will be pathed
REM *                   if no Parameter is put on the bat file
REM * - composerInstalled : Where I insatlled composerInstalled
REM * - phpFolder : The folder structure that contains the Multiple
REM *               possible version of PHP I have installed
REM **********************************************************************


set baseWamp=C:\wamp64
set defaultPHPver=7.1.26
set composerInstalled=C:\Users\User\AppData\Roaming\Composer
set phpFolder=C:\wamp64\bin\php

if %1.==. (
    set phpver=C:\wamp64\bin\php\php%defaultPHPver%
) else (
    set phpver=C:\wamp64\bin\php\php
)

PATH=%PATH%;%phpver%
php -v
echo ---------------------------------------------------------------


REM IF PEAR IS INSTALLED IN THIS VERSION OF PHP

IF exist %phpver%\pear (
    set PHP_PEAR_SYSCONF_DIR=C:\wamp64\bin\php\php%phpver%
    set PHP_PEAR_INSTALL_DIR=C:\wamp64\bin\php\php%phpver%\pear
    set PHP_PEAR_DOC_DIR=C:\wamp64\bin\php\php%phpver%\docs
    set PHP_PEAR_BIN_DIR=C:\wamp64\bin\php\php%phpver%
    set PHP_PEAR_DATA_DIR=C:\wamp64\bin\php\php%phpver%\data
    set PHP_PEAR_PHP_BIN=C:\wamp64\bin\php\php%phpver%\php.exe
    set PHP_PEAR_TEST_DIR=C:\wamp64\bin\php\php%phpver%\tests

    echo PEAR INCLUDED IN THIS CONFIG
    echo ---------------------------------------------------------------
) else (
    echo PEAR DOES NOT EXIST IN THIS VERSION OF php
    echo ---------------------------------------------------------------
)

REM IF COMPOSER EXISTS ADD THAT TOO
REM **************************************************************
REM * IF A GLOBAL COMPOSER EXISTS ADD THAT TOO
REM *
REM * This assumes that composer is installed in /wamp/composer
REM *
REM **************************************************************
IF EXIST %composerInstalled% (
    ECHO COMPOSER INCLUDED IN THIS CONFIG
    echo ---------------------------------------------------------------
    set COMPOSER_HOME=C:\Users\User\AppData\Roaming\Composer
    set COMPOSER_CACHE_DIR=C:\Users\User\AppData\Roaming\Composer

    PATH=%PATH%;C:\Users\User\AppData\Roaming\Composer

    rem echo TO UPDATE COMPOSER do > composer self-update
    echo ---------------------------------------------------------------
) else (
    echo ---------------------------------------------------------------
    echo COMPOSER IS NOT INSTALLED
    echo ---------------------------------------------------------------
)

set baseWamp=
set defaultPHPver=
set composerInstalled=
set phpFolder=

这就是我的困惑所在。

在命令行中使用命令提示符phppath,我得到以下输出
PHP 7.1.26 (cli) (built: Jan  9 2019 21:51:32) ( ZTS MSVC14 (Visual C++ 2015) x64 )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
---------------------------------------------------------------
PEAR DOES NOT EXIST IN THIS VERSION OF php
---------------------------------------------------------------
COMPOSER INCLUDED IN THIS CONFIG
---------------------------------------------------------------
---------------------------------------------------------------

另外,我无法使用phppath命令行更改我的PHP版本。

我的WAMP64安装上的版本包括5.6.40-7.0.33-7.1.26-7.2.14-7.3.1
我正在尝试做的(尽管phppath.cmd可以实现这一点),正如在该线程中看到的那样,使用一个简单的命令更改php CLI版本。

phppath 5.6.40

phppath 7.0.33

etc



但是这些命令无效,它们处理正确,无论是否指定了命令行,PHP 7.1.26 (cli)都始终显示状态。

尝试将上述脚本从linux转换为Windows 10时,我是否弄乱了路径或其他东西?我试图确保所有路径都是合适的。

编辑:使用W10 x64版本WAMP 3.1.7。阅读使用Powershell时出现问题,或者phppath.cmd并非为Powershell设计,因此我将Cmder程序用于命令行功能。

编辑2:搞清楚php 7.1.26确实在我的环境变量中。我只在查看USER env变量。它以某种方式进入SYSTEM环境变量(不完全确定如何)。删除了可能引起冲突的条目。进行更多测试。

现在,让phppath.cmd正常工作。

edit3:现在进行最后编辑。.如果有人有任何见解,请稍后再尝试解决。因此,正如我所说的,wamp php目录位于系统环境变量中,一旦我删除了该条目,WAMP中的错误消息[ERROR C:/wamp64 or PHP in path.]就消失了。

至于在PHP CLI版本之间进行切换/更改-到目前为止,这是一个临时解决方案,但可行...如果我只是将phppath.cmd文件夹中的C:\Windows文件从set defaultPHPver=7.1.26更改为另一个版本,例如set defaultPHPver=7.0.33set defaultPHPver=5.6.40, -可以在命令行上使用phppath更改PHP CLI版本(重启后)。

看起来如何运作是...

(手动在cmd文件中设置defaultpath ...)...
像cmder一样打开一个CLI
输入..

phppath



(在我的phppath.cmd中,默认版本为7.0.x)
PHP 7.0.33 (cli) (built: Dec  5 2018 21:22:29) ( ZTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
---------------------------------------------------------------
PEAR DOES NOT EXIST IN THIS VERSION OF php
---------------------------------------------------------------
COMPOSER INCLUDED IN THIS CONFIG
---------------------------------------------------------------
---------------------------------------------------------------

然后,我可以继续使用默认的php CLI函数。
php -f version.php

Current version is PHP 7.0.33



注意:如果不首先使用phppath命令启动,则会收到典型的错误消息'php' is not recognized as an internal or external command, operable program or batch file.,因此必须输入phppath才能使php命令起作用。

因此,目前这是很好且可行的。我只需要手动将phppath.cmd编辑为想要的默认版本,然后重置计算机即可。

唯一的问题是,按照说明进行操作,phppath.cmd应该能够使用我上面尝试的命令即时更改PHP CLI版本。当然,这比必须手动编辑.cmd文件并在每次更改版本时都重新启动更好。

对于为什么我的Windows 10修改的phppath.cmd仅通过修改文件并重新启动计算机,为什么不通过命令行更改版本的人有任何见解?将不胜感激...下来的最后一步:)

编辑:注释很长,以总结将%PATH%定义为pathBak确实是答案,如@michael_heath中所示。使用以下脚本完全可以在我的Windows 10机器上正常工作,更改版本以及全部使用。

最佳答案

在未编辑的第20行中:

set phpver=%baseWamp%%phpFolder%%1

与经过修改的第28行相比:
set phpver=C:\wamp64\bin\php\php
%1是包含第一个脚本参数值的变量。
修改后的版本缺少%1,因此它不会更改版本,
而是使用固定路径。这可能是您的主要问题。

尝试此编辑版本:
@echo off

REM ***************************************************************
REM * PLACE This file in a folder that is already on your PATH
REM * Or just put it in your C:\Windows folder as that is on the
REM * Search path by default
REM * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
REM * EDIT THE NEXT 3 Parameters to fit your installed WAMPServer
REM * for example I installed WAMPServer on the D: drive you may
REM * have used C:
REM * - baseWamp : is the drive and folder where you installed
REM *              WAMPServer
REM * - defaultPHPver : is the version of PHP that will be pathed
REM *                   if no Parameter is put on the bat file
REM * - composerInstalled : Where I installed composerInstalled
REM * - phpFolder : The folder structure that contains the Multiple
REM *               possible version of PHP I have installed
REM ***************************************************************

if not defined pathBak set "pathBak=%PATH%"

set "baseWamp=C:\wamp64"
set "defaultPHPver=7.1.26"
set "composerInstalled=%appData%\composer"
set "phpFolder=\bin\php\php"

if "%~1" == "" (
    set "phpVer=%baseWamp%%phpFolder%%defaultPHPver%"
) else if "%~1" == "dir" (
    for /d %%A in ("%baseWamp%%phpFolder%*") do echo %%~nxA
    goto :end
) else (
    set "phpVer=%baseWamp%%phpFolder%%~1"
)

set "PATH=%pathBak%;%phpVer%"
php -v
echo ---------------------------------------------------------------


REM IF PEAR IS INSTALLED IN THIS VERSION OF PHP

if exist "%phpVer%\pear" (
    set "PHP_PEAR_SYSCONF_DIR=%phpVer%"
    set "PHP_PEAR_INSTALL_DIR=%phpVer%\pear"
    set "PHP_PEAR_DOC_DIR=%phpVer%\docs"
    set "PHP_PEAR_BIN_DIR=%phpVer%"
    set "PHP_PEAR_DATA_DIR=%phpVer%\data"
    set "PHP_PEAR_PHP_BIN=%phpVer%\php.exe"
    set "PHP_PEAR_TEST_DIR=%phpVer%\tests"

    echo PEAR INCLUDED IN THIS CONFIG
    echo ---------------------------------------------------------------
) else (
    set "PHP_PEAR_SYSCONF_DIR="
    set "PHP_PEAR_INSTALL_DIR="
    set "PHP_PEAR_DOC_DIR="
    set "PHP_PEAR_BIN_DIR="
    set "PHP_PEAR_DATA_DIR="
    set "PHP_PEAR_PHP_BIN="
    set "PHP_PEAR_TEST_DIR="

    echo PEAR DOES NOT EXIST IN THIS VERSION OF php
    echo ---------------------------------------------------------------
)

REM IF A GLOBAL COMPOSER EXISTS ADD THAT TOO
REM **************************************************************
REM * IF A GLOBAL COMPOSER EXISTS ADD THAT TOO
REM *
REM * This assumes that composer is installed in /wamp/composer ?
REM *
REM **************************************************************
if exist "%composerInstalled%" (
    echo COMPOSER INCLUDED IN THIS CONFIG
    echo ---------------------------------------------------------------
    set "COMPOSER_HOME=%composerInstalled%"
    set "COMPOSER_CACHE_DIR=%composerInstalled%"

    set "PATH=%PATH%;%composerInstalled%"

    rem echo TO UPDATE COMPOSER do > composer self-update
    echo ---------------------------------------------------------------
) else (
    echo ---------------------------------------------------------------
    echo COMPOSER IS NOT INSTALLED
    echo ---------------------------------------------------------------
)

:end
set "baseWamp="
set "defaultPHPver="
set "composerInstalled="
set "phpFolder="
  • 编辑版本使用的路径。
  • 您的硬编码路径已替换为现有变量。
  • %phpFolder%更改为相对路径,并附加到%baseWamp%使用情况(如未经编辑的版本)。
  • Composer路径已更改为%appData%\composer,该路径应与您的硬编码路径匹配。
  • 通过删除开头的%baseWamp%\bin\php\php来修复“梨子”部分中的路径。
  • 如果在选定的PHP版本中不存在,则取消定义Pear变量。
  • 添加了%pathBak%以存储原始PATH值,因此,原始PATH如果脚本在同一 session 中再次运行,则可以重用该值。
  • 添加了参数dir。将列出文件夹名称,以便您可以看到
    有哪些版本可用。
  • 关于php - 在Windows 10上的多个PHP版本之间进行切换的同时,在WAMP(WAMP64)中实现CLI PHP的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55387799/

    有关php - 在Windows 10上的多个PHP版本之间进行切换的同时,在WAMP(WAMP64)中实现CLI PHP的正确方法的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

      总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

    3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

      很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

    5. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

      我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

    6. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

      我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

    7. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

      在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

    8. Ruby 方法() 方法 - 2

      我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

    9. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

      我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

    10. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

      我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

    随机推荐