对一个命令使用不同的 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 变量或修改 composercomposer.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:很遗憾这不起作用。可能是因为当phpcomposer /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 作为替代版本你可以php7php71php56

这里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 可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

PHP之CLI模式

如何在 Ubuntu 14.04 上更改 php-cli 版本?

执行php.exe程序cli提示错误如何解决

Mac 安装PHP Redis 扩展

Symfony CLI 在运行“new”命令时没有使用正确的 PHP 版本

PHP JSON 函数在被称为 CLI 脚本时不可用?