Usar diferentes versiones de PHP CLI ejecutables para un comando


Así que tengo Gentoo box con tres versiones de PHP instaladas (sin importar las razones):

  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

Quiero instalar Laravel framework usando composer:

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

Esto sin embargo arroja un error porque Laravel requiere PHP > 5.5.9 y el intérprete predeterminado php es 5.4. Así que emito otro comando:

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

Esto me lleva un paso más allá, pero luego algunos comandos posteriores a la instalación de Laravel composer.json entran en juego, y la instalación se bloquea.

Esto se debe al hecho de que composer.json los comandos se ven así:

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

Como puede ver, el intérprete "por defecto" se utiliza de nuevo!

Ahora, los archivos PHP adecuados comienzan con el siguiente shebang:

#!/usr/bin/env php

Esta es una buena característica ya que el intérprete PHP se puede encontrar en diferentes ubicaciones en diferentes sistemas. Desafortunadamente, en este caso el comando env devuelve la ruta primer ejecutable que encuentra en $PATH variable ambiental.

¿Cómo podría alterar el entorno de sesión actual o qué tipo de truco realizar para la ejecución de todo el proceso de instalación de Laravel php el comando invocaría /usr/bin/php5.6 en lugar de /usr/bin/php?

No quiero cambiar la variable $PATH ni modificar archivos como composer, composer.json o la utilidad CLI de Laravel artisan.


Editar: también asume que quiero hacer esto desde una cuenta de usuario normal (es decir, sin root permiso).

Author: roomcays, 2015-07-03

5 answers

Tal vez usted puede tratar de arreglar el environnement!

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

O, si no desea modificar la ruta de acceso para su sesión de shell, puede limitar el cambio solo para el comando actual:

$ 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
Author: Guillaume Crico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-05 17:27:24

El ejecutable PHP predeterminado se puede encontrar usando:

$ which php

En la mayoría de los casos es un enlace a una versión particular de PHP:

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

Para cambiarlo a una versión diferente, simplemente vuelva a vincularlo a otra

$ sudo rm /usr/bin/php

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

Antes de volver a enlazar, debe asegurarse de que la versión de PHP de destino esté instalada.

 12
Author: Saleniex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-24 10:52:51

Identifique dónde está el comando genérico actual php y a qué binario apunta con which php.

Te dará una ruta a un enlace simbólico como mencionas en tu pregunta

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

Edite el enlace simbólico para apuntar a la versión de php que desee por ahora, vea aquí https://unix.stackexchange.com/questions/88824/how-can-i-edit-symlinks

Cuando haya terminado, simplemente invierta el proceso.

ACTUALIZAR: también puede agregar un alias para el usuario actual editando ~/.bashrc y añadiendo lo siguiente

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

Ver si esto funciona

 8
Author: Alex Andrei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:36:28

Desde que surgió PHP7 Debian Linux crea diferentes ejecutables para las versiones 5 y 7 de PHP en /usr/bin de forma predeterminada (si instala ambas versiones, eso es).

Llamar a esas diferentes versiones desde la línea de comandos es tan simple como siempre:

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

Esto obviamente solo es bueno para scripts simples. Para cualquier cosa más grande (compositor, artesano, etc.) tendrás que cambiar la variable PATH.

Para cambiar la versión de su servidor Apache está usando todo lo que tiene que hacer is:

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

Y viceversa si desea utilizar la versión más baja de PHP.

Mencionarlo en caso de que alguien tenga problemas similares en Debian.

 6
Author: Krzysztof Karski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-17 12:24:09

Para cualquier otra persona que no encontró ninguna solución en lo anterior, porque usan composer update y de alguna manera se usa la versión incorrecta de PHP. Usando composer self-update obtuve más información y finalmente descubrí que en el composer.json puede especificar un platform en la sección config, que anula qué versión de php es utilizada por composer. Simplemente cambiar este valor o eliminar esta configuración resolvió mi problema.

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

 0
Author: Rein Baarsma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-11 08:53:02