Используйте разные исполняемые файлы CLI версии PHP для одной команды
Итак, у меня есть поле Gentoo с тремя установленными версиями PHP (не забудьте причины):
-
/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
Я хочу установить структуру 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 файлы начинаются со следующего shebang:
#!/usr/bin/env php
Это хорошая функция, поскольку PHP-интерпретатор можно найти в разных местах в разных системах.
К сожалению, в этом случае команда env
возвращает путь к первому исполняемому файлу, который он находит в переменной $PATH
.
Как я могу изменить текущую среду сеанса или какой трюк выполнить для выполнения всего процесса установки Laravel. php
команда будет вызывать /usr/bin/php5.6
вместо /usr/bin/php
?
Я не хочу изменять переменную $PATH
или изменять файлы типа composer
, composer.json
или утилиту CLAR Laravel artisan
.
Изменить: также предположим, что я хочу сделать это из обычной учетной записи пользователя (т.е. без корневых разрешений).
Ответы
Ответ 1
Возможно, вы можете попытаться исправить окружающую среду!
$ 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) ...
Ответ 2
Исполняемый файл 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.
Ответ 3
Определите, где находится текущая общая php
команда и к которой она указывает с помощью which php
.
Это даст вам путь к символической ссылке, как вы упомянули в своем вопросе
/usr/bin/php -> /usr/lib64/php5.4/bin/php
Отредактируйте символическую ссылку, чтобы указать, на какую версию php вы хотите сейчас, см. здесь
https://unix.stackexchange.com/questions/88824/how-can-i-edit-symlinks
Когда вы закончите, просто измените процесс.
UPDATE:
вы также можете добавить alias
для текущего пользователя, отредактировав ~/.bashrc
и добавив следующие
alias php='/usr/bin/php5.6'
посмотрите, работает ли это
Ответ 4
С момента появления PHP7 Debian Linux по умолчанию создает разные исполняемые файлы для PHP версий 5 и 7 в /usr/bin (если вы устанавливаете обе версии).
Вызов этих разных версий из командной строки прост, как сейчас:
[email protected]:~ $ 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
[email protected]:~ $ 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 используется все, что вам нужно сделать:
[email protected]:~# 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.
Ответ 5
Для тех, кто не нашел решения в вышеупомянутом, потому что они используют composer update
и как-то используется неправильная версия PHP. Используя composer self-update
я получил некоторую дополнительную информацию и, в конце концов, узнал, что в composer.json
вы можете указать platform
в разделе config
, которая переопределяет, какая версия php используется композитором. Просто изменив это значение или удалив эту конфигурацию, я решил проблему.
composer.json "config": { "platform": { "php": "7.1" },
Ответ 6
Это можно сделать с помощью alias
, но имейте в виду, что псевдонимы не расширены по умолчанию.
Вы также должны включить их расширение.
shopt -s expand_aliases alias php="/usr/local/bin/php-5.6"./some-script.sh unalias php # back to previous version
Ответ 7
Я считаю, что проще всего добиться того же, например, создать мягкую ссылку, как, например,
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
- пункт назначения/ссылка
Ответ 8
Буэн диам. Привет, спасибо! Обновление $/opt/cpanel/ea-php71/root/usr/bin/php/opt/cpanel/composer/bin/composer