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
Save w00fz/142b6b19750ea6979137b963df959d11 to your computer and use it in GitHub Desktop.
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

yushine commented Aug 31, 2017

Good job. Thanks.

Copy link

ghost commented Oct 13, 2017

hi there. thanks for this great script. i used it thankfully the last years... but with the latest brew i experienced some troubles, so what i am thinking about is: with sierra and high sierra i do not use the built in apache anymore, as it is said here:

so i am using the brew httpd and brew does not want to start httpd with sudo or at least its not recommended.
so i modified the parts in this script here to stop and start apache with "brew services start httpd" and "brew services stop httpd"... in this script u are restarting it with sudo... when listing "brew services list", the httpd service is marked yellow...

didnt u experience some problems? wouldnt it be better to restart the brew apache with "brew services stop httpd" and "brew services start httpd"?

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