对一个命令使用不同的 PHP 版本 CLI 可执行文件
Use different PHP version CLI executable for one command
所以我安装了三个 PHP 版本的 Gentoo box(不管原因):
/usr/bin/php
-> /usr/lib64/php5.4/bin/php
/usr/bin/php5.5
-> /usr/lib64/php5.5/bin/php
/usr/bin/php5.6
-> /usr/lib64/php5.4/bin/php
我想使用 composer 安装 Laravel framework:
$ composer create-project laravel/laravel --prefer-dist
然而,这会引发错误,因为 Laravel 需要 PHP > 5.5.9,默认的 php
解释器是 5.4。
所以我发出另一个命令:
$ /usr/bin/php5.6 /usr/bin/composer create-project laravel/laravel --prefer-dist
这让我更进一步,但是 Laravel 的 composer.json
中的一些 post-install 命令开始起作用,安装崩溃。
这是因为 composer.json
命令如下所示:
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
可以看到,又用到了"default"解释器!
现在,正确的 PHP 文件以以下 shebang 开头:
#!/usr/bin/env php
这是一个不错的功能,因为 PHP 解释器可以在不同系统的不同位置找到。
不幸的是,在这种情况下 env
命令 returns 它在 $PATH
环境变量中找到的第一个可执行文件的路径。
我怎么可能改变当前会话环境或执行什么样的技巧才能执行整个 Laravel 安装过程 php
命令将调用 /usr/bin/php5.6
而不是 /usr/bin/php
?
我不想更改 $PATH
变量或修改 composer
、composer.json
或 Laravel 的 CLI 实用程序 artisan
等文件。
编辑:还假设我想从普通用户帐户(即没有 root 权限)执行此操作。
用 which php
.
识别当前通用 php
命令所在的位置以及它指向哪个二进制文件
它会给你一个符号链接的路径,就像你在问题中提到的那样
/usr/bin/php -> /usr/lib64/php5.4/bin/php
编辑符号链接以指向您现在想要的 php 版本,请参见此处
https://unix.stackexchange.com/questions/88824/how-can-i-edit-symlinks
完成后只需反向执行即可。
更新:
您还可以通过编辑 ~/.bashrc
并添加以下
为当前用户添加 alias
alias php='/usr/bin/php5.6'
看看是否可行
也许你可以尝试修复环境!
$ php -v
PHP 5.4.x (cli) ...
$ set PATH="/usr/lib64/php5.6/bin:$PATH"
$ php -v
PHP 5.6.x (cli) ...
或者,如果您不想修改 shell 会话的 PATH,您可以仅针对当前命令更改范围:
$ php -v
PHP 5.4.x (cli) ...
$ env PATH="/usr/lib64/php5.6/bin:$PATH" php -v
PHP 5.6.x (cli) ...
$ php -v
PHP 5.4.x (cli) ...
自从 PHP7 出现后,Debian Linux 默认为 /usr/bin 中的 PHP 版本 5 和 7 创建了不同的可执行文件(如果你同时安装了这两个版本)。
从命令行调用这些不同的版本现在一如既往地简单:
kkarski@debian:~ $ php5 -v
PHP 5.6.26-0+deb8u1 (cli) (built: Sep 21 2016 12:37:50)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
kkarski@debian:~ $ php -v
PHP 7.0.9-1~dotdeb+8.1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.9-1~dotdeb+8.1, Copyright (c) 1999-2016, by Zend Technologies
这显然只适用于简单的脚本。对于更大的东西(作曲家,artisan 等),您必须更改 PATH 变量。
要更改您的 Apache 服务器正在使用的版本,您只需:
root@debian:~# a2dismod php5 && a2enmod php7.0
Module php5 disabled.
To activate the new configuration, you need to run:
service apache2 restart
Considering conflict php5 for php7.0:
Enabling module php7.0.
To activate the new configuration, you need to run:
service apache2 restart
如果您想使用较低的 PHP 版本,反之亦然。
提及它以防有人在 Debian 上遇到类似问题。
默认 PHP 可执行文件可以通过以下方式找到:
$ which php
大多数情况下 link 到特定 PHP 版本:
lrwxrwxrwx 1 root root 21 aug 15 2016 /usr/bin/php -> /usr/bin/php7.1
要将其更改为不同的版本,只需重新link 将其更改为另一个
$ sudo rm /usr/bin/php
$ sudo ln -s /usr/bin/php5.6 /usr/bin/php
在重新link之前,您必须确保安装了目标 PHP 版本。
对于在上面找不到解决方案的任何其他人,因为他们使用 composer update
并且不知何故使用了错误的 PHP 版本。通过使用 composer self-update
我获得了更多信息并最终发现在 composer.json
中你可以在 config
部分指定一个 platform
,它会覆盖 php版本由作曲家使用。只需更改此值或删除此配置即可解决我的问题。
composer.json
"config": {
"platform": {
"php": "7.1"
},
可以使用 alias
,但请记住,默认情况下不会扩展别名。
您还必须启用这些扩展。
$ shopt -s expand_aliases
$ alias php="/usr/local/bin/php-5.6"
$ ./some-script.sh
$ unalias php # back to previous version
我发现最简单的方法就是创建一个软件link,例如
ln -s /opt/php-7.0.32/bin/php /usr/bin/php7
ln -s /opt/php-7.1/bin/php /usr/bin/php71
ln -s /opt/php-5.6/bin/php /usr/bin/php56
然后当你使用你的默认版本时说它是 php7.2 作为替代版本的 php 你可以 php7
或 php71
或 php56
这里 ln -s /opt/php-7.1/bin/php /usr/bin/php71
是 source/orginal 文件,/usr/bin/php7
是目的地 / link
我在 "script + docker image" 上工作,以便在开发过程中随时可以使用多个 php 版本:https://github.com/jclaveau/docker-php-multiversion
你可以这样使用它:
$ php 5.6 -v
PHP 5.6.40-15+ubuntu18.04.1+deb.sury.org+1 (cli)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans
$ php 7.3 -v
PHP 7.3.13-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Dec 18 2019 14:48:49) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.13, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.13-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
with Xdebug v2.9.0, Copyright (c) 2002-2019, by Derick Rethans
因为它使用 Docker.io,您不需要更改系统配置的任何部分。
希望对您有所帮助
所以我安装了三个 PHP 版本的 Gentoo box(不管原因):
/usr/bin/php
->/usr/lib64/php5.4/bin/php
/usr/bin/php5.5
->/usr/lib64/php5.5/bin/php
/usr/bin/php5.6
->/usr/lib64/php5.4/bin/php
我想使用 composer 安装 Laravel framework:
$ composer create-project laravel/laravel --prefer-dist
然而,这会引发错误,因为 Laravel 需要 PHP > 5.5.9,默认的 php
解释器是 5.4。
所以我发出另一个命令:
$ /usr/bin/php5.6 /usr/bin/composer create-project laravel/laravel --prefer-dist
这让我更进一步,但是 Laravel 的 composer.json
中的一些 post-install 命令开始起作用,安装崩溃。
这是因为 composer.json
命令如下所示:
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
可以看到,又用到了"default"解释器!
现在,正确的 PHP 文件以以下 shebang 开头:
#!/usr/bin/env php
这是一个不错的功能,因为 PHP 解释器可以在不同系统的不同位置找到。
不幸的是,在这种情况下 env
命令 returns 它在 $PATH
环境变量中找到的第一个可执行文件的路径。
我怎么可能改变当前会话环境或执行什么样的技巧才能执行整个 Laravel 安装过程 php
命令将调用 /usr/bin/php5.6
而不是 /usr/bin/php
?
我不想更改 $PATH
变量或修改 composer
、composer.json
或 Laravel 的 CLI 实用程序 artisan
等文件。
编辑:还假设我想从普通用户帐户(即没有 root 权限)执行此操作。
用 which php
.
php
命令所在的位置以及它指向哪个二进制文件
它会给你一个符号链接的路径,就像你在问题中提到的那样
/usr/bin/php -> /usr/lib64/php5.4/bin/php
编辑符号链接以指向您现在想要的 php 版本,请参见此处 https://unix.stackexchange.com/questions/88824/how-can-i-edit-symlinks
完成后只需反向执行即可。
更新:
您还可以通过编辑 ~/.bashrc
并添加以下
alias
alias php='/usr/bin/php5.6'
看看是否可行
也许你可以尝试修复环境!
$ php -v
PHP 5.4.x (cli) ...
$ set PATH="/usr/lib64/php5.6/bin:$PATH"
$ php -v
PHP 5.6.x (cli) ...
或者,如果您不想修改 shell 会话的 PATH,您可以仅针对当前命令更改范围:
$ php -v
PHP 5.4.x (cli) ...
$ env PATH="/usr/lib64/php5.6/bin:$PATH" php -v
PHP 5.6.x (cli) ...
$ php -v
PHP 5.4.x (cli) ...
自从 PHP7 出现后,Debian Linux 默认为 /usr/bin 中的 PHP 版本 5 和 7 创建了不同的可执行文件(如果你同时安装了这两个版本)。
从命令行调用这些不同的版本现在一如既往地简单:
kkarski@debian:~ $ php5 -v
PHP 5.6.26-0+deb8u1 (cli) (built: Sep 21 2016 12:37:50)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
kkarski@debian:~ $ php -v
PHP 7.0.9-1~dotdeb+8.1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.9-1~dotdeb+8.1, Copyright (c) 1999-2016, by Zend Technologies
这显然只适用于简单的脚本。对于更大的东西(作曲家,artisan 等),您必须更改 PATH 变量。
要更改您的 Apache 服务器正在使用的版本,您只需:
root@debian:~# a2dismod php5 && a2enmod php7.0
Module php5 disabled.
To activate the new configuration, you need to run:
service apache2 restart
Considering conflict php5 for php7.0:
Enabling module php7.0.
To activate the new configuration, you need to run:
service apache2 restart
如果您想使用较低的 PHP 版本,反之亦然。
提及它以防有人在 Debian 上遇到类似问题。
默认 PHP 可执行文件可以通过以下方式找到:
$ which php
大多数情况下 link 到特定 PHP 版本:
lrwxrwxrwx 1 root root 21 aug 15 2016 /usr/bin/php -> /usr/bin/php7.1
要将其更改为不同的版本,只需重新link 将其更改为另一个
$ sudo rm /usr/bin/php
$ sudo ln -s /usr/bin/php5.6 /usr/bin/php
在重新link之前,您必须确保安装了目标 PHP 版本。
对于在上面找不到解决方案的任何其他人,因为他们使用 composer update
并且不知何故使用了错误的 PHP 版本。通过使用 composer self-update
我获得了更多信息并最终发现在 composer.json
中你可以在 config
部分指定一个 platform
,它会覆盖 php版本由作曲家使用。只需更改此值或删除此配置即可解决我的问题。
composer.json
"config": {
"platform": {
"php": "7.1"
},
可以使用 alias
,但请记住,默认情况下不会扩展别名。
您还必须启用这些扩展。
$ shopt -s expand_aliases
$ alias php="/usr/local/bin/php-5.6"
$ ./some-script.sh
$ unalias php # back to previous version
我发现最简单的方法就是创建一个软件link,例如
ln -s /opt/php-7.0.32/bin/php /usr/bin/php7
ln -s /opt/php-7.1/bin/php /usr/bin/php71
ln -s /opt/php-5.6/bin/php /usr/bin/php56
然后当你使用你的默认版本时说它是 php7.2 作为替代版本的 php 你可以 php7
或 php71
或 php56
这里 ln -s /opt/php-7.1/bin/php /usr/bin/php71
是 source/orginal 文件,/usr/bin/php7
是目的地 / link
我在 "script + docker image" 上工作,以便在开发过程中随时可以使用多个 php 版本:https://github.com/jclaveau/docker-php-multiversion
你可以这样使用它:
$ php 5.6 -v
PHP 5.6.40-15+ubuntu18.04.1+deb.sury.org+1 (cli)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans
$ php 7.3 -v
PHP 7.3.13-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Dec 18 2019 14:48:49) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.13, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.13-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
with Xdebug v2.9.0, Copyright (c) 2002-2019, by Derick Rethans
因为它使用 Docker.io,您不需要更改系统配置的任何部分。
希望对您有所帮助