对一个命令使用不同的 PHP 版本 CLI 可执行文件
Posted
技术标签:
【中文标题】对一个命令使用不同的 PHP 版本 CLI 可执行文件【英文标题】:Use different PHP version CLI executable for one command 【发布时间】:2015-09-21 07:10:14 【问题描述】:所以我安装了三个 php 版本的 Gentoo 盒子(没关系):
/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
的一些安装后命令开始发挥作用,安装崩溃。
这是因为composer.json
命令看起来像这样:
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
如您所见,“默认”解释器又被使用了!
现在,正确的 PHP 文件以以下 shebang 开头:
#!/usr/bin/env php
这是一个不错的功能,因为 PHP 解释器可以在不同系统的不同位置找到。
不幸的是,在这种情况下,env
命令返回它在$PATH
环境变量中找到的第一个可执行文件的路径。
我怎么可能改变当前会话环境或执行什么样的技巧来执行整个 Laravel 安装过程 php
命令会调用 /usr/bin/php5.6
而不是 /usr/bin/php
?
我不想更改 $PATH
变量或修改 composer
、composer.json
或 Laravel 的 CLI 实用程序 artisan
等文件。
编辑:还假设我想从普通用户帐户执行此操作(即没有 root 权限)。
【问题讨论】:
如何创建一个临时符号链接并稍后恢复它?也看GNU stow
您必须制作一个自定义包装脚本,例如,它支持导出的 PHP_BIN
环境变量,或者默认为 /usr/bin/php
否则。 (另见In Bash, when to alias, when to script, and when to write a function?)——此外,一旦你安装了三个以上的版本,你就正式成为囤积者了。
关于alias
:很遗憾这不起作用。可能是因为当php
被composer
或 被/usr/bin/env
调用时,alias
不起作用。
完美答案。谢谢。
【参考方案1】:
可以使用以下命令找到默认的 PHP 可执行文件:
$ which php
在大多数情况下,它是指向特定 PHP 版本的链接:
lrwxrwxrwx 1 root root 21 aug 15 2016 /usr/bin/php -> /usr/bin/php7.1
要将其更改为不同的版本,只需将其重新链接到另一个
$ sudo rm /usr/bin/php
$ sudo ln -s /usr/bin/php5.6 /usr/bin/php
在重新链接之前,您必须确保已安装目标 PHP 版本。
【讨论】:
不敢相信这个真的帮了我!谢谢! @Saleniex 兄弟,谢谢+++ 谢谢!需要大量搜索才能找到这个有用的答案。 您可以使用sudo mv -n /usr/bin/php /usr/bin/php.old
来保留旧版本的副本。【参考方案2】:
也许你可以尝试修复环境!
$ 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) ...
【讨论】:
就是这样!我已经输入:PATH="/usr/lib64/php5.6/bin:$PATH" php /usr/bin/composer create-project laravel/laravel --prefer-dist
,安装成功!使用命令在一行中设置 PATH
不会更改全局 PATH 变量。非常感谢纪尧姆·克里科!
使用 Mac 的任何一种方法都没有改变,你在哪里取消设置默认 php 的路径?
这对我不起作用:env PATH="/opt/php71/bin/php:$PATH" php -v
不断告诉 php 5.x
也试过这个变种:PATH="/opt/php71/bin/php:$PATH" sh -c 'php -v'
,它是一样的。如果我运行PATH="/opt/php71/bin/php:$PATH" sh -c 'echo $PATH | grep php'
,至少我可以看到PATH正在被修改,但即使在PATH中有php 7,下面的php -v
命令仍然执行php 5。
第一个,使用 'set PATH' 在 Debian 上对我不起作用。它不会更改为 5.6.x。永久为 5.4.x。【参考方案3】:
用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'
看看有没有效果
【讨论】:
这个答案和来自 Arkadiusz Drabczyk 的评论是有效的,但我忘了提到,我不能修改系统符号链接 (/usr/bin/*
),因为整个操作是从普通用户帐户完成的(没有根)。
更新了答案,虽然我看到@mario 已经暗示alias
谢谢,我已经在对我的问题的评论中回答了关于 alias
的问题。
我来自谷歌,所以我认为这对我来说是最好的解决方案。我尝试了@Guillaume 的解决方案,该解决方案非常有用,但至少在我的情况下,在composer update
之后,系统试图执行php artisan optimize
(再次使用错误的php
版本)。所以我为当前用户创建了一个alias
,它就像一个魅力。请注意,您必须先注销再登录,否则别名不会生效。谢谢亚历克斯!【参考方案4】:
自从 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
这显然只适用于简单的脚本。对于任何更大的东西(作曲家、工匠等),您必须更改 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 上遇到类似问题。
【讨论】:
我一直在努力完全更改版本...但是您的解决方案挽救了我的一天... +1 给我.. 非常感谢...【参考方案5】:我发现最简单的方法就是创建一个软链接,例如
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 作为替代版本你可以php7
或php71
或php56
这里ln -s /opt/php-7.1/bin/php /usr/bin/php71
是源/原始文件,/usr/bin/php7
是目标/链接
【讨论】:
【参考方案6】:对于其他在上述问题中找不到解决方案的人,因为他们使用composer update
并且不知何故使用了错误的 PHP 版本。通过使用composer self-update
,我获得了更多信息,最终发现在composer.json
中,您可以在config
部分指定platform
,它会覆盖composer 使用的php 版本。只需更改此值或删除此配置即可解决我的问题。
composer.json
"config":
"platform":
"php": "7.1"
,
【讨论】:
缺少一个括号。只有您可以编辑它,因为它少于 6 个字符的变化。 “配置”:“平台”:“php”:“7.1”, 好的,在这样做之后,输入 /usr/bin/env php -v 仍然给我 php 5.4.16【参考方案7】:我开发了一个“脚本 + docker 映像”,以便在开发过程中随时提供多个 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,因此您无需更改系统配置的任何部分。
希望对你有帮助
【讨论】:
【参考方案8】:可以使用alias
,但请记住默认情况下不会扩展别名。
您还必须启用这些扩展。
$ shopt -s expand_aliases
$ alias php="/usr/local/bin/php-5.6"
$ ./some-script.sh
$ unalias php # back to previous version
【讨论】:
以上是关于对一个命令使用不同的 PHP 版本 CLI 可执行文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Ubuntu 14.04 上更改 php-cli 版本?