So I have Gentoo box with three PHP versions installed (nevermind the reasons):
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:
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
I don’t want to change
$PATH variable or modify files like
composer.json or Laravel’s CLI utility
Edit: also assume that I want to do this from regular user account (i.e. with no root permissions).
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) ...
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.
Identify where the current generic
php command is and to which binary it points to with
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
When you are done just reverse the process.
you can also add an
alias for the current user by editing
~/.bashrc and adding the following
see if this works out
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:
[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
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:
[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
and vice versa if you want to use the lower PHP version.
Mentioning it in case someone has similar problems on Debian.
For anyone else who found no solution in the above, because they use
composer update and somehow the wrong PHP version gets used. By using
composer self-update I got some more info and eventually found out that in the
composer.json you can specify a
platform in the
config section, which overrides what php version is used by composer. Simply changing this value or removing this config solved my issue.
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
ln -s /opt/php-7.1/bin/php /usr/bin/php71 is the source/orginal file and
/usr/bin/php7 is the destination / link
I worked on a “script + docker image” to make multiple php versions available whenever I want during development: https://github.com/jclaveau/docker-php-multiversion
You can use it this way:
$ php 5.6 -v PHP 5.6.40-15+ubuntu18.04.1+deb.sury.org+1 (cli) 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 with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans $ php 7.3 -v PHP 7.3.13-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Dec 18 2019 14:48:49) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.13, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.3.13-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies with Xdebug v2.9.0, Copyright (c) 2002-2019, by Derick Rethans
As it uses Docker.io, you do not need to alter any part of your system configuration.
Hoping it would help you
It’s possible to do using
alias, but keep in mind that aliases are not expanded by default.
You must also enable expanding of those.
$ shopt -s expand_aliases $ alias php="/usr/local/bin/php-5.6" $ ./some-script.sh $ unalias php # back to previous version