web-dev-qa-db-fra.com

Utilisez différent PHP version CLI exécutable pour une commande

J'ai donc une boîte Gentoo avec trois versions PHP installées (peu importe les raisons):

  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

Je veux installer Laravel framework using composer:

$ composer create-project laravel/laravel --prefer-dist

Cependant, cela génère une erreur car Laravel nécessite PHP> 5.5.9 et que l'interpréteur php par défaut est 5.4 . J'émets donc une autre commande:

$ /usr/bin/php5.6 /usr/bin/composer create-project laravel/laravel --prefer-dist

Cela me fait avancer un peu plus loin, mais certaines commandes de post-installation du composer.json de Laravel entrent en jeu et l'installation se bloque.

Cela est dû au fait que les commandes composer.json ressemblent à ceci:

"post-install-cmd": [
    "php artisan clear-compiled",
    "php artisan optimize"
],

Comme vous pouvez le constater, l'interpréteur "par défaut" est à nouveau utilisé!

Maintenant, les fichiers PHP appropriés commencent par Shebang:

#!/usr/bin/env php

C'est une fonctionnalité intéressante, car l'interprète PHP peut être trouvé à différents emplacements sur différents systèmes . Malheureusement, dans ce cas, la commande env renvoie le chemin du premier exécutable trouvé dans la variable d'environnement $PATH.

Comment puis-je éventuellement modifier l’environnement de la session en cours ou quel type d’astuce à exécuter pour que la commande php du processus d’installation de Laravel entier appelle la méthode /usr/bin/php5.6 au lieu de /usr/bin/php?

Je ne veux pas changer la variable $PATH ni modifier des fichiers tels que composer, composer.json ou l'utilitaire CLI de Laravel artisan.


Éditer: supposons également que je veuille faire cela à partir d’un compte utilisateur normal (c’est-à-dire sans autorisations root).

29
roomcays

Peut-être que vous pouvez essayer de réparer l'environnement!

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

Ou, si vous ne souhaitez pas modifier le PATH pour votre session Shell, vous pouvez limiter la modification à la commande en cours uniquement:

$ 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

L'exécutable par défaut PHP peut être trouvé en utilisant:

$ which php

Dans la plupart des cas, il s'agit d'un lien vers une version particulière de PHP:

lrwxrwxrwx 1 root root      21 aug 15  2016 /usr/bin/php -> /usr/bin/php7.1

Pour changer de version, reliez-le simplement à un autre

$ Sudo rm /usr/bin/php

$ Sudo ln -s /usr/bin/php5.6 /usr/bin/php

Avant de relier, vous devez vous assurer que la version cible PHP est installée.

18
Saleniex

Identifiez où se trouve la commande générique actuelle php et vers quel binaire elle pointe avec which php.

Cela vous donnera un chemin vers un lien symbolique comme vous l'avez mentionné dans votre question.

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

Modifiez le lien symbolique pour indiquer la version de PHP que vous souhaitez pour l'instant, voir ici https://unix.stackexchange.com/questions/88824/how-can-i-edit-symlinks

Lorsque vous avez terminé, il suffit d'inverser le processus.

UPDATE: Vous pouvez également ajouter une alias pour l’utilisateur actuel en modifiant ~/.bashrc et en ajoutant ce qui suit:

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

voir si ça marche

9
Alex Andrei

Depuis que PHP7 est arrivé, Debian Linux crée par défaut différents exécutables pour PHP versions 5 et 7 dans/usr/bin (si vous installez les deux versions).

L'appel de ces différentes versions à partir de la ligne de commande est aussi simple que jamais:

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

Ce n'est évidemment bon que pour les scripts simples. Pour tout ce qui est plus grand (compositeur, artisan, etc.), vous devrez changer la variable PATH.

Pour changer la version utilisée par votre serveur Apache, il vous suffit de:

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

et inversement si vous souhaitez utiliser la version inférieure PHP.

Le mentionner au cas où quelqu'un aurait des problèmes similaires sur Debian.

6
Krzysztof Karski

Pour tous ceux qui n'ont trouvé aucune solution dans ce qui précède, car ils utilisent composer update et, d'une manière ou d'une autre, la mauvaise version PHP est utilisée. En utilisant composer self-update, j'ai obtenu quelques informations supplémentaires et j'ai finalement découvert que, dans le composer.json, vous pouvez spécifier un platform dans la section config, qui remplace la version php utilisée par composer. Changer simplement cette valeur ou supprimer cette configuration a résolu mon problème.

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

0
Rein Baarsma

Il est possible d'utiliser alias, mais gardez à l'esprit que les alias ne sont pas développés par défaut.

Vous devez également activer l'extension de ceux-ci.

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

Je trouve le plus facile de réaliser la même chose que de créer un lien symbolique comme par exemple

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

alors que vous utilisez votre version par défaut, dites que c'est php7.2 et que php pour version alternative, vous pouvez utiliser php7 ou php71 ou php56

ici ln -s /opt/php-7.1/bin/php /usr/bin/php71 est le fichier source/original et /usr/bin/php7 est la destination/lien

0
Joshi