对一个命令使用不同的 PHP 版本 CLI 可执行文件

Use different PHP version CLI executable for one command

所以我安装了三个 PHP 版本的 Gentoo box(不管原因):

  1. /usr/bin/php -> /usr/lib64/php5.4/bin/php
  2. /usr/bin/php5.5 -> /usr/lib64/php5.5/bin/php
  3. /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 变量或修改 composercomposer.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 你可以 php7php71php56

这里 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,您不需要更改系统配置的任何部分。

希望对您有所帮助