首页 > 解决方案 > 在 WAMP (WAMP64) 中 CLI PHP 的正确方法,同时在 Windows 10 上的多个 PHP 版本之间切换

问题描述

以前只是将 wamp php 目录放在我的系统环境变量中,如下所示:命令行本地使用 wamp。这或多或少是一个非常简单的环境变量编辑添加WAMP服务器PHP路径,例如;C:\wamp\bin\php\php5.6.40

我现在正在学习 WAMP 建议不要这样做的更新版本(如下所示:How To Run PHP From Windows Command Line in WAMPServer)。

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

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

@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

7.1.26 (cli)但是这些命令是无效的,它们处理正确,无论是否指定,命令行总是显示 PHP 。

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

编辑:使用 W10 x64 版本 WAMP 3.1.7。阅读有使用 Powershell 的问题,或者phppath.cmd不是为 powershell 设计的,所以我使用该程序Cmder来执行命令行功能。

编辑 2:发现 php 7.1.26 确实在我的环境变量中。我只是在查看 USER env 变量。不知何故,它进入了 SYSTEM 环境变量(不完全确定如何)。删除了可能导致冲突的条目。进行更多测试..

现在才能phppath.cmd正常工作。

编辑3:现在最后一次编辑..我稍后会尝试更多地解决这个问题,如果有人有任何见解,请提供!因此,正如我所说的 wamp php 目录位于系统环境变量中,一旦我删除了该条目ERROR C:/wamp64 or PHP in path.,WAMP 中的错误消息 [ ] 就消失了。

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

它似乎是如何工作的......

(在 cmd 文件中手动设置默认路径...)... 打开一个 CLI,如 cmder 输入..

php路径

(这里我在我的 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
---------------------------------------------------------------
---------------------------------------------------------------

然后我可以继续使用默认的phpCLI 功能..

php -f version.php

当前版本是 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机器上工作,版本更改等等。

标签: phpwindowsbatch-filecmdcommand-line

解决方案


在未编辑的第 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应与您的硬编码路径匹配的路径。
  • 通过删除前导来修复 Pear 部分中的路径%baseWamp%\bin\php\php
  • 如果所选 PHP 版本中不存在 Pear 变量,请取消定义。
  • 添加%pathBak%以存储原始PATH值,因此PATH 如果在同一会话中再次运行脚本,则可以重用原始值。
  • 添加了参数dir。将列出文件夹名称,以便您查看可用的版本。

推荐阅读