it-swarm.com.ru

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

Итак, у меня есть Gentoo box с тремя установленными 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 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

Это продвигает меня на один шаг вперед, но затем вступают в действие некоторые команды после установки из composer.json от Laravel, и происходит сбой установки.

Это связано с тем, что команды 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 или утилита CLI Laravel artisan.


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

29
roomcays

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

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

Или, если вы не хотите изменять PATH для своего сеанса Shell, вы можете изменить область только для текущей команды:

$ 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) ...
32
Guillaume Crico

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

18
Saleniex

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

посмотрим, получится ли это

9
Alex Andrei

Поскольку появился 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.

6
Krzysztof Karski

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

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

0
Rein Baarsma

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

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

shopt -s expand_aliases alias php="/usr/local/bin/php-5.6" ./some-script.sh unalias php # back to previous version

0

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

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 - адресат/ссылка

0
Joshi