Using Homebrew is a handy way to install multiple versions of PHP on MacOS. For example, to have both php
7.4 and 8.0 installed, use the brew install
command.
First install the 7.4 version, like so:
% brew install [email protected]
The syntax for specifying a specific version of a package with Homebrew is brew install <packageName>@<version>
. In this case the package name is php
and the version is 7.4
(defaulting to 7.4.32
as of this writing). If you leave off the @<version>
part entirely, Homebrew will install whatever the latest version available is (8.1
as of this writing).
To check that version 7.4 of php
is correctly installed:
% /opt/homebrew/opt/[email protected]/bin/php -v
PHP 7.4.32 (cli) (built: Sep 29 2022 10:45:51) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.32, Copyright (c), by Zend Technologies
Ideally we would like to refer to /opt/homebrew/opt/[email protected]/bin/php
simply as php
on our command line. This requires another step:
% brew link --force --overwrite [email protected]
Linking /opt/homebrew/Cellar/[email protected]/7.4.32... 812 symlinks created.
If you need to have this software first in your PATH instead consider running:
echo 'export PATH="/opt/homebrew/opt/[email protected]/bin:$PATH"' >> ~/.zshrc
echo 'export PATH="/opt/homebrew/opt/[email protected]/sbin:$PATH"' >> ~/.zshrc
As a result of running brew link
we can now find the linked version of php
at this path: /opt/homebrew/bin/php
.
% ls -l /opt/homebrew/bin/php
lrwxr-xr-x 1 myuser admin 32 15 Oct 18:34 /opt/homebrew/bin/php -> ../Cellar/[email protected]/7.4.32/bin/php
% /opt/homebrew/bin/php -v
PHP 7.4.32 (cli) (built: Sep 29 2022 10:45:51) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.32, Copyright (c), by Zend Technologies
The output of running brew link
has a suggestion that we append two lines to the end of our ~/.zshrc
file to tell our terminal that when we refer to php
it should look for it first in the /opt/homebrew/opt/[email protected]/bin
folder. You can do this but every time you brew link
to a different version of php
you will have to edit those lines. Instead I will take a slightly modified approach:
% echo 'export PATH="/opt/homebrew/sbin:/opt/homebrew/bin:$PATH"' >> ~/.zshrc
% source ~/.zshrc
Now our terminal will find the linked version of php
at /opt/homebrew/bin
first whenever we refer to php
.
% which php
/opt/homebrew/bin/php
% php -v
PHP 7.4.32 (cli) (built: Sep 29 2022 10:45:51) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.32, Copyright (c), by Zend Technologies
Now that we have php
version 7.4 installed we can continue by installing php
version 8.0 too.
% brew install [email protected]
Now we tell brew to link to the new version of php
:
% brew link --force --overwrite [email protected]
Unlinking /opt/homebrew/Cellar/[email protected]/7.4.32... 328 symlinks removed.
Linking /opt/homebrew/Cellar/[email protected]/8.0.24... 232 symlinks created.
In the output from this command we again see the suggestion to run two commands containing the command export PATH...
but due to the steps we took above, this won't be necessary.
% which php
/opt/homebrew/bin/php
% php -v
PHP 8.0.24 (cli) (built: Sep 30 2022 08:39:20) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.24, Copyright (c) Zend Technologies
with Xdebug v3.1.5, Copyright (c) 2002-2022, by Derick Rethans
with Zend OPcache v8.0.24, Copyright (c), by Zend Technologies
Now we can switch from versions of 7.4 to 8.0 by relinking from one to the other: brew link --force --overwrite [email protected]
or brew link --force --overwrite [email protected]
for example.
If you're not sure what versions are available to link to, try this command:
% brew ls --versions | grep '^php[ @]'
[email protected] 7.4.32
[email protected] 8.0.24
Finally, below is the source code of a more full featured script that I call phpswitch
. This script can be set to be executable and then run from the terminal like phpswitch 8.0
or phpswitch 7.4
.
#!/bin/bash
if [ $# -ne 1 ]; then
echo 1>&2 "USAGE: $0 <phpVersion>"
exit 2
fi
INSTALLED_VERSIONS=`find /opt/homebrew/opt | grep 'php@' | sed 's/\/opt\/homebrew\/opt\/php@//'`
if [[ ! -f /opt/homebrew/opt/php@${1}/bin/php ]]; then
echo 1>&2 "/opt/homebrew/opt/php@${1}/bin/php was not found"
printf 'valid options:\n%s\n' "${INSTALLED_VERSIONS[*]}"
exit 2
fi
for VERSION in ${INSTALLED_VERSIONS[*]}; do
brew unlink php@$VERSION > /dev/null 2>&1
brew services stop php@$VERSION > /dev/null 2>&1
done
brew link --force --overwrite php@$1 > /dev/null 2>&1
brew services start php@$1 > /dev/null 2>&1
Top comments (6)
I change PHP versions just with
And it works without any script.
I think you mean
brew unlink [email protected]
andbrew link [email protected]
🙂I've updated the comment, thanks.
Have you tried ServBay.dev?
It's a much easier tool for PHP developers, providing a user-friendly experience, especially for beginners. It supports all versions of PHP, MariaDB, PostgreSQL, as well as Redis and Memcached. You can run multiple PHP instances simultaneously and switch between them effortlessly. It also offers easy updates without the need to configure environment variables. This tool has greatly simplified my PHP development and is definitely worth trying!
Hi,
Here is a small contribution to check version available on your system and pick one.
It also takes an optional argument if you want to switch directly to a version.
Nice post! If you’re managing multiple PHP versions with Homebrew, I’ve been using ServBay lately as suggested from a friend , and it’s been a game-changer for me it so goood . It offers the same flexibility in managing PHP versions, but with a lot more features built-in, like MariaDB, PostgreSQL, Redis, and Memcached and many other ai features even local llms take a look at it