Skip to content

Instantly share code, notes, and snippets.

Last active February 7, 2022 00:12
Star You must be signed in to star a gist
What would you like to do?
PHP switcher
# Check if command was ran as root.
if [[ $(id -u) -eq 0 ]]; then
echo "The command \"sphp\" should not be executed as root or via sudo directly."
echo "When a service requires root access, you will be prompted for a password as needed."
exit 1
# Usage
if [ $# -ne 1 ]; then
echo "Usage: sphp [phpversion]"
echo "Versions installed:"
brew list | grep '^php[0-9]\{2,\}$' | grep -o -E '[0-9]+' | while read -r line ; do
echo " - phpversion: $line"
exit 1
currentversion="`php -r \"error_reporting(0); echo str_replace('.', '', substr(phpversion(), 0, 3));\"`"
brew list php$newversion 2> /dev/null > /dev/null
if [ $? -eq 0 ]; then
echo "PHP version $newversion found"
# Check if new version is already the current version.
# if [ "${newversion}" == "${currentversion}" ]; then
# echo -n "PHP version ${newversion} is already being used. Continue by reloading? (y/n) "
# while true; do
# read -n 1 yn
# case $yn in
# [Yy]* ) echo && break;;
# [Nn]* ) echo && exit 1;;
# esac
# done
# fi
echo "Unlinking old binaries..."
brew unlink php$currentversion 2> /dev/null > /dev/null
echo "Linking new binaries..."
brew link php$newversion
echo "Linking new modphp addon..."
sudo ln -sf `brew list php$newversion | grep libphp` /usr/local/lib/libphp${majorNew}.so
echo /usr/local/lib/libphp${majorNew}.so
echo "Fixing LoadModule..."
apacheConf=`httpd -V | grep -i server_config_file | cut -d '"' -f 2`
sudo sed -i -e "/LoadModule php${majorOld}_module/s/^#*/#/" $apacheConf
if grep "LoadModule php${majorNew}_module .*php${newversion}" $apacheConf > /dev/null
sudo sed -i -e "/LoadModule php${majorNew}_module .*php${newversion}/s/^#//" $apacheConf
sudo sed -i -e "/LoadModule php${majorNew}_module/s/^#//" $apacheConf
echo "Updating version file..."
pgrep -f /usr/sbin/httpd 2> /dev/null > /dev/null
if [ $? -eq 0 ]; then
echo "Restarting system Apache..."
sudo pkill -9 -f /usr/sbin/httpd
sudo /usr/sbin/apachectl -k restart > /dev/null 2>&1
pgrep -f /usr/local/"Cellar|opt"/*/httpd 2> /dev/null > /dev/null
if [ $? -eq 0 ]; then
echo "Restarting homebrew Apache..."
sudo pkill -9 -f /usr/local/"Cellar|opt"/*/httpd
sudo /usr/local/bin/apachectl -k restart > /dev/null 2>&1
# pgrep -x httpd 2> /dev/null > /dev/null
# if [ $? -eq 0 ]; then
# echo "Restarting non-root homebrew Apache..."
# httpd -k restart > /dev/null 2>&1
# fi
echo "Done."
# Show PHP CLI version for verification.
echo && php -v
echo "PHP version $majorNew.$minorNew was not found."
echo "Try \`brew install php${newversion}\` first."
exit 1
Copy link

jdoubleu commented Dec 1, 2017

For macOS users this script might act a bit different.

The sed in macOS requires a suffix for the in-place option -i (see
It creates a file named httpd.conf-e because it uses the -e option as suffix argument.
Just change line 55 to:
sudo sed -i '' -e "/LoadModule php${majorOld}_module/s/^#*/#/" $apacheConf

Copy link

Hint for macOS High Sierra users: If you run into /usr/local/sbin is not writeable errors, check that your /usr/local/sbin actually exists. If not, just creating it and chowning it to your user solves the problem.

Copy link

vukanac commented Apr 20, 2018

    # Remove from PATH - ALL
    sed -i '' "/php@5.6/d" "$HOME/.zshrc"
    sed -i '' "/php@7.2/d" "$HOME/.zshrc"
    # Add new to PATH
    echo 'export PATH="$(brew --prefix '"$php_version"')/bin:$PATH"' >> "$HOME/.zshrc"

Copy link

Thank you for this script! Unfortunately it isn't changing the PATH for me, and so only Apache PHP is changed and not CLI PHP. I use zsh and Homebrew PHP. Based on the comments above this is supposed to work, but for me it just doesn't.

I came up with this Bash function to call instead of sphp. It calls sphp and then finds the PATH within .zshrc and replaces it:

function switch_php() {
	CURR_PHP_VERSION=$(php -v | tail -r | tail -n 1 | cut -d " " -f 2 | cut -c 1-3)

		echo "Already on $NEW_PHP_VERSION ya idiot."
		echo "Switching from $CURR_PHP_VERSION to $NEW_PHP_VERSION."


		sed -i '' "s/php@$CURR_PHP_VERSION/php@$NEW_PHP_VERSION/g" "$HOME/.zshrc"
		source ~/.zshrc

		echo "New CLI PHP:"
		php -v


Call it like so: switch_php 7.2.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment