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

roo*_*ays 34 php linux env command-line-interface laravel

所以我安装了三个PHP版本的Gentoo盒子(没关系原因):

  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框架:

$ composer create-project laravel/laravel --prefer-dist
Run Code Online (Sandbox Code Playgroud)

但是这会引发错误,因为Laravel要求PHP> 5.5.9并且默认php解释器为5.4.所以我发出另一个命令:

$ /usr/bin/php5.6 /usr/bin/composer create-project laravel/laravel --prefer-dist
Run Code Online (Sandbox Code Playgroud)

这让我更进了一步,但随后Laravel的一些安装后命令composer.json发挥作用,安装崩溃了.

这是因为composer.json命令看起来像这样:

"post-install-cmd": [
    "php artisan clear-compiled",
    "php artisan optimize"
],
Run Code Online (Sandbox Code Playgroud)

如您所见,再次使用"默认"解释器!

现在,正确的PHP文件从以下shebang开始:

#!/usr/bin/env php
Run Code Online (Sandbox Code Playgroud)

这是一个很好的功能,因为PHP解释器可以在不同系统的不同位置找到.不幸的是,在这种情况下,env命令返回它在$PATH环境变量中找到的第一个可执行文件的路径.

我怎么可能改变当前的会话环境或执行什么样的技巧,以便执行整个Laravel安装过程php命令/usr/bin/php5.6而不是/usr/bin/php

我不想改变$PATH变量或修改文件一样composer,composer.json或者Laravel的CLI工具artisan.


编辑:还假设我想从常规用户帐户执行此操作(即没有root权限).

小智 36

也许你可以尝试修复环境!

$ php -v
PHP 5.4.x (cli) ...
$ set PATH="/usr/lib64/php5.6/bin:$PATH"
$ php -v
PHP 5.6.x (cli) ...
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想修改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) ...
Run Code Online (Sandbox Code Playgroud)

  • 这就对了!我已输入:`PATH ="/ usr/lib64/php5.6/bin:$ PATH"php/usr/bin/composer create-project laravel/laravel --prefer-dist`并安装成功完成!使用命令在一行中设置`PATH`不会更改全局PATH变量.非常感谢Guillaume Crico! (2认同)

小智 29

可以使用以下命令找到默认的PHP可执

$ which php
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,它是特定PHP版本的链接:

lrwxrwxrwx 1 root root      21 aug 15  2016 /usr/bin/php -> /usr/bin/php7.1
Run Code Online (Sandbox Code Playgroud)

要将其更改为其他版本,只需将其重新链接到另一个版本

$ sudo rm /usr/bin/php

$ sudo ln -s /usr/bin/php5.6 /usr/bin/php
Run Code Online (Sandbox Code Playgroud)

在重新链接之前,您必须确保安装目标PHP版本.


Ale*_*rei 10

确定当前通用php命令的位置以及它指向的二进制文件which php.

它将为您提供一个符号链接的路径,就像您在问题中提到的那样

/usr/bin/php -> /usr/lib64/php5.4/bin/php

编辑符号链接以指向您现在想要的php版本,请参阅 https://unix.stackexchange.com/questions/88824/how-can-i-edit-symlinks

完成后,只需撤消该过程即可.

更新:您还可以alias通过编辑~/.bashrc和添加以下内容为当前用户添加

alias php='/usr/bin/php5.6'

看看这是否成功


Krz*_*ski 6

自从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
Run Code Online (Sandbox Code Playgroud)

这显然只适用于简单的脚本.对于任何更大的东西(作曲家,工匠等),你将不得不改变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
Run Code Online (Sandbox Code Playgroud)

如果你想使用较低的PHP版本,反之亦然.

提及它以防有人在Debian上遇到类似的问题.