Use different PHP version CLI executable for one command

80,393

Solution 1

Maybe you can try to fix the environnement!

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

Or, if you don't want to modify the PATH for your shell session, you can scope the change for the current command only:

$ 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) ...

Solution 2

Default PHP executable can be found using:

$ which php

In most cases it is link to particular PHP version:

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

To change it to different version just relink it to another

$ sudo rm /usr/bin/php

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

Before relink you have to make sure target PHP version is installed.

Solution 3

Identify where the current generic php command is and to which binary it points to with which php.

It will give you a path to a symlink like you mention in your question

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

Edit the symlink to point to which ever php version you want for now, see here https://unix.stackexchange.com/questions/88824/how-can-i-edit-symlinks

When you are done just reverse the process.

UPDATE: you can also add an alias for the current user by editing ~/.bashrc and adding the following

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

see if this works out

Solution 4

Since PHP7 came around Debian Linux creates different executables for PHP versions 5 and 7 in /usr/bin by default (if you install both versions that is).

Calling those different versions from the command line is as simple as ever now:

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

This is obviously only good for simple scripts. For anything larger (composer, artisan etc.) you'll have to change the PATH variable.

To change the version your Apache server is using all you have to do 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

and vice versa if you want to use the lower PHP version.

Mentioning it in case someone has similar problems on Debian.

Solution 5

I find the easiest to achieve the same like just create a softlink like for example

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

then as you use your default version say it is php7.2 as just php for alternative version you can you php7 or php71 or php56

here ln -s /opt/php-7.1/bin/php /usr/bin/php71 is the source/orginal file and /usr/bin/php7 is the destination / link

Share:
80,393
roomcays
Author by

roomcays

Updated on January 16, 2020

Comments

  • roomcays
    roomcays over 4 years

    So I have Gentoo box with three PHP versions installed (nevermind the reasons):

    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

    I want to install Laravel framework using composer:

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

    This however throws an error because Laravel requires PHP > 5.5.9 and the default php interpreter is 5.4. So I issue another command:

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

    This takes me one step further, but then some post-install commands from Laravel's composer.json comes into play, and installation crashes.

    This is due to the fact, that composer.json commands look like this:

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

    As you can see, the "default" interpreter is used again!

    Now, proper PHP files start with following shebang:

    #!/usr/bin/env php
    

    This is nice feature as PHP interpreter can be found under different locations on different systems. Unfortunatelly, in this case env command returns path to the first executable it finds in $PATH environmental variable.

    How could I possibly alter current session environment or what kind of trick to perform so for the execution of whole Laravel installation process php command would invoke /usr/bin/php5.6 instead of /usr/bin/php?

    I don't want to change $PATH variable or modify files like composer, composer.json or Laravel's CLI utility artisan.


    Edit: also assume that I want to do this from regular user account (i.e. with no root permissions).

  • roomcays
    roomcays almost 9 years
    This answer and a comment from Arkadiusz Drabczyk would be valid, but I forgot to mention, that I can't modify system symlinks (/usr/bin/*) as whole operation is to be done from common user account (no root).
  • Alex Andrei
    Alex Andrei almost 9 years
    updated answer, although i see @mario already hinted towards alias
  • roomcays
    roomcays almost 9 years
    Thanks, I have answered about alias in the comment to my question.
  • roomcays
    roomcays almost 9 years
    That is it! I have entered: PATH="/usr/lib64/php5.6/bin:$PATH" php /usr/bin/composer create-project laravel/laravel --prefer-dist and installation completed successfully! Setting PATH in one line with command does not change global PATH variable. Thanks a lot Guillaume Crico!
  • Saiyan Prince
    Saiyan Prince about 7 years
    I was struggling with changing the version entirely... But your solution saved my day... +1 from me.. Thanks a tonne...
  • OZZIE
    OZZIE almost 7 years
    Using Mac nothing changes with either method, where do you unset the path to the default php?
  • mayid
    mayid almost 7 years
    This is not working for me: env PATH="/opt/php71/bin/php:$PATH" php -v keeps telling php 5.x
  • mayid
    mayid almost 7 years
    Also tried this variant: PATH="/opt/php71/bin/php:$PATH" sh -c 'php -v' and it's the same. At least I can see the PATH is being modified if I run PATH="/opt/php71/bin/php:$PATH" sh -c 'echo $PATH | grep php' but even having php 7 in the PATH the following php -v command still executes php 5.
  • Pezhvak
    Pezhvak over 6 years
    can't believe that this one really helped me! thanks!
  • Simon
    Simon over 6 years
    The first one, using 'set PATH' does not work for me on Debian. It does not change to 5.6.x. It is permanently 5.4.x.
  • Onur Demir
    Onur Demir over 6 years
    same for me,too
  • Kamae
    Kamae over 6 years
    I came from Google so I think it worth to say this has been the best solution for me. I tried the @Guillaume 's solution which is really usefull, but at least in my case, after the composer update the system was trying to do a php artisan optimize (using the wrong php version again). So I created an alias just for the current user and it worked like a charm. Please note you have to log out and log in, otherwise the alias does not take effect. Thanks Alex!
  • voodoo417
    voodoo417 over 5 years
    @Saleniex Bro,Thanks+++
  • user1111929
    user1111929 about 5 years
    Thank you! Needed to search a lot to find this useful answer.
  • samerivertwice
    samerivertwice over 3 years
    There's a bracket missing. Only you can edit it, as it's less than 6 chars change. "config": { "platform": { "php": "7.1" } },
  • samerivertwice
    samerivertwice over 3 years
    ok, after doing this, entering /usr/bin/env php -v still gives me php 5.4.16
  • K.Karamazen
    K.Karamazen over 3 years
    You could use sudo mv -n /usr/bin/php /usr/bin/php.old in order to preserve a copy of the old version.