Используйте исполняемый файл CLI другой версии PHP для одной команды

Итак, у меня установлен Gentoo с тремя версиями PHP (не говоря уже о причинах):

  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

Я хочу установить фреймворк Laravel с помощью композитора:

$ 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 начинаются со следующей строки:

#!/usr/bin/env php

Это приятная функция, поскольку интерпретатор PHP можно найти в разных местах в разных системах. К сожалению, в этом случае команда env возвращает путь к первому исполняемому файлу, который она находит в переменной среды $PATH.

Как я мог изменить текущую среду сеанса или какой трюк выполнить, чтобы для выполнения всего процесса установки Laravel команда php вызывала /usr/bin/php5.6 вместо /usr/bin/php?

Я не хочу изменять $PATH переменную или модифицировать такие файлы, как composer, composer.json или утилиту Laravel CLI artisan.


Изменить: также предположим, что я хочу сделать это из учетной записи обычного пользователя (т.е. без прав root).


person roomcays    schedule 03.07.2015    source источник
comment
Как насчет создания временной символической ссылки и ее восстановления позже? Также посмотрите GNU stow   -  person Arkadiusz Drabczyk    schedule 03.07.2015
comment
Вам нужно будет создать собственный сценарий оболочки, который, например, учитывает экспортированную переменную среды PHP_BIN или по умолчанию /usr/bin/php else. (См. Также В Bash, когда использовать псевдоним, когда скрипт и когда писать функцию?) - Кроме того, если у вас установлено более трех версий, вы официально накопитель.   -  person mario    schedule 03.07.2015
comment
Насчет alias: к сожалению, это не работает. Возможно, потому что alias не работает, когда php вызывается composer или /usr/bin/env.   -  person roomcays    schedule 03.07.2015
comment
Прекрасный ответ. Спасибо.   -  person prog_24    schedule 04.01.2017


Ответы (8)


Может, вы попробуете исправить окружающую среду!

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

Или, если вы не хотите изменять 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) ...
person Guillaume Crico    schedule 05.08.2015
comment
Вот и все! Я ввел: PATH="/usr/lib64/php5.6/bin:$PATH" php /usr/bin/composer create-project laravel/laravel --prefer-dist и установка успешно завершена! Установка PATH в одной строке с командой не изменяет глобальную переменную PATH. Большое спасибо, Гийом Крико! - person roomcays; 12.08.2015
comment
При использовании Mac ничего не меняется ни в одном из этих методов, где убрать путь к php по умолчанию? - person OZZIE; 12.09.2017
comment
У меня это не работает: env PATH="/opt/php71/bin/php:$PATH" php -v продолжает говорить php 5.x - person mayid; 14.09.2017
comment
Тоже пробовал этот вариант: PATH="/opt/php71/bin/php:$PATH" sh -c 'php -v' и он такой же. По крайней мере, я вижу, что PATH изменяется, если я запускаю PATH="/opt/php71/bin/php:$PATH" sh -c 'echo $PATH | grep php', но даже имея php 7 в PATH, следующая команда php -v все еще выполняет php 5. - person mayid; 14.09.2017
comment
Первый, использование «set PATH», не работает для меня в Debian. Не меняется на 5.6.x. Это постоянно 5.4.x. - person Simon; 22.10.2017
comment
то же самое и для меня - person Onur Demir; 22.11.2017

Исполняемый файл 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 установлена.

person Saleniex    schedule 24.04.2017
comment
не могу поверить, что это действительно помогло мне! Благодарность! - person Pezhvak; 13.10.2017
comment
@Saleniex Бро, спасибо +++ - person voodoo417; 20.12.2018
comment
Спасибо! Пришлось много искать, чтобы найти этот полезный ответ. - person user1111929; 15.05.2019
comment
Вы можете использовать sudo mv -n /usr/bin/php /usr/bin/php.old, чтобы сохранить копию старой версии. - person K.Karamazen; 17.12.2020

Определите, где находится текущая универсальная команда 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'

посмотрим, сработает ли это

person Alex Andrei    schedule 03.07.2015
comment
Этот ответ и комментарий Аркадиуша Драбчика будут действительными, но я забыл упомянуть, что я не могу изменять системные символические ссылки (/usr/bin/*), поскольку вся операция должна выполняться из общей учетной записи пользователя (без root). - person roomcays; 03.07.2015
comment
обновленный ответ, хотя я вижу, что @mario уже намекнул на alias - person Alex Andrei; 03.07.2015
comment
Спасибо, я ответил по поводу alias в комментарии к моему вопросу. - person roomcays; 03.07.2015
comment
Я пришел из Google, поэтому считаю, что это лучшее решение для меня. Я попробовал решение @Guillaume, которое действительно полезно, но, по крайней мере, в моем случае, после composer update система пыталась выполнить php artisan optimize (снова используя неправильную версию php). Итак, я создал alias только для текущего пользователя, и он отлично сработал. Обратите внимание, что вам необходимо выйти и войти в систему, иначе псевдоним не вступит в силу. Спасибо, Алекс! - person Kamae; 07.02.2018

Поскольку появился PHP7, Debian Linux по умолчанию создает разные исполняемые файлы для PHP версий 5 и 7 в / usr / bin (если вы устанавливаете обе версии).

Вызывать эти разные версии из командной строки так же просто, как и раньше:

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.

person Krzysztof Karski    schedule 17.10.2016
comment
Я пытался полностью изменить версию ... Но ваше решение спасло мне день ... +1 от меня ... Большое спасибо ... - person Saiyan Prince; 30.03.2017

Я считаю, что проще всего добиться того же, просто создать мягкую ссылку, например

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 - это исходный / исходный файл, а /usr/bin/php7 - это место назначения / ссылка

person Joshi    schedule 22.02.2019

Для всех, кто не нашел решения в вышеизложенном, потому что они используют composer update и каким-то образом используется неправильная версия PHP. Используя composer self-update, я получил дополнительную информацию и, в конце концов, обнаружил, что в composer.json вы можете указать platform в разделе config, который переопределяет, какая версия php используется композитором. Простое изменение этого значения или удаление этой конфигурации решило мою проблему.

composer.json "config": { "platform": { "php": "7.1" },

person Rein Baarsma    schedule 11.06.2018
comment
Отсутствует скоба. Только вы можете его редактировать, так как он меняется менее чем на 6 символов. config: {платформа: {php: 7.1}}, - person samerivertwice; 04.10.2020
comment
хорошо, после этого ввод / usr / bin / env php -v по-прежнему дает мне php 5.4.16 - person samerivertwice; 04.10.2020

Я работал над «скриптом + образ докера», чтобы сделать несколько версий 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, вам не нужно изменять какую-либо часть конфигурации вашей системы.

Надеюсь, это поможет тебе

person Meuoi    schedule 06.01.2020

Можно использовать alias, но имейте в виду, что по умолчанию псевдонимы не раскрываются.

Вы также должны разрешить их расширение.

$ shopt -s expand_aliases
$ alias php="/usr/local/bin/php-5.6"
$ ./some-script.sh
$ unalias php # back to previous version
person Arkadiusz 'flies' Rzadkowolski    schedule 03.12.2018