Switching between PHP versions

This is going to be heavily technical. If you’re generally more interested in other ramblings I post about, you can skip this post. It’s okay, I won’t be disappointed.


I recently learned how to run multiple versions of PHP on my local machine and switch between them using Homebrew. It’s pretty straightforward, actually.

brew install [email protected]

…tells brew to install the latest PHP 7.4 version. This gets installed into /usr/local/opt/[email protected]/7.4.{latest-release}. Installing PHP at a particular revision does not necessarily mean that you are using that revision. In order to use PHP 7.4, I need to do this:

brew link php7.4

That command creates symlinks between the Homebrew-managed path to that PHP version and /usr/local/bin/php. If I then want to switch to a different version of PHP that I’ve installed previously, I’d first need to

brew unlink php7.4

and then

brew link [email protected]

…or whatever version I wanted to switch to.

This is nice that I can switch between versions — in fact, it’s pretty powerful — but the brew unlink / brew link dance can be cumbersome. There must be a better way!

Informercial gif of a woman dropping spice jars out of her cabinet.

A solution

I’ve solved this dance using some clever bash commands I stole borrowed from a fellow Pantheor, Brian Weaver, and a tool that a former colleage at Human Made forked and improved upon called Taskfile. I’ll let you head over there and read about what it does and how you use it. The first step is installing it so you can run t from the commandline.

Taskfile lets me shortcut bash functions to the t command that are contextual to the folder I might be looking at, but you can also add to and edit the global Taskfile with functions that work everywhere by just typing t edit. In my case, I’ve created a series of functions that let me switch to whatever version of PHP I want, e.g.

t php8

With that single command I can:

  • Identify which version of PHP I have installed
  • Identify the newest version of PHP I have installed
  • Unlink from the current PHP version
  • Link to the new PHP version
  • Only type 6 characters! (Let’s face it, that’s the real win here, amirite?)

The code looks like this:

unlink_php() {
PHP_CURRENT=$(php -v | head -n 1 | cut -d " " -f 2 | cut -f1-2 -d".");
PHP_LATEST=$(ls /usr/local/Cellar/php | cut -f1-2 -d".");
echo "Your current PHP version is ${PHP_CURRENT}";
echo "The latest version of PHP installed is ${PHP_LATEST}";
echo "Unlinking PHP ${PHP_CURRENT}";
if [ ${PHP_CURRENT} = ${PHP_LATEST} ]; then
brew unlink php
brew unlink [email protected]${PHP_CURRENT}
php7() {
echo "Linking php 7.4…"
brew link [email protected]
php8() {
echo "Linking php 8"
brew link [email protected]
php81() {
echo "Linking php 8.1"
brew link php
view raw taskfile.sh hosted with ❤ by GitHub

When I want to add a new PHP version, once I’ve installed it with brew, I can just run t edit and add a new function:

php82() {
    echo "Linking PHP 8.2"
    brew link [email protected]

It’s important to check against the latest version of PHP because Homebrew maps this to just php, as opposed to other version releases, which are mapped to [email protected]{version-number}, e.g. [email protected], so we need to check what the latest version of PHP is, according to brew. Interestingly enough, this supports development versions, too, so installing (as of this writing) PHP 8.2 will install as [email protected] rather than being mapped to php because it’s the “newest” version.

This has taken the headache out of switching back and forth between multiple PHP versions which is a thing I’ve been doing more of recently as I need to test different host environments. I really like Taskfile a lot and use it for all sorts of things and this is yet another example of how useful it can be. I highly recommend it!

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.