#!/bin/bash | |
# 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 | |
fi | |
# 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" | |
done | |
exit 1 | |
fi | |
currentversion="`php -r \"error_reporting(0); echo str_replace('.', '', substr(phpversion(), 0, 3));\"`" | |
newversion="$1" | |
majorOld=${currentversion:0:1} | |
majorNew=${newversion:0:1} | |
minorNew=${newversion:1:1} | |
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 | |
then | |
sudo sed -i -e "/LoadModule php${majorNew}_module .*php${newversion}/s/^#//" $apacheConf | |
else | |
sudo sed -i -e "/LoadModule php${majorNew}_module/s/^#//" $apacheConf | |
fi | |
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 | |
fi | |
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 | |
fi | |
# 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 | |
else | |
echo "PHP version $majorNew.$minorNew was not found." | |
echo "Try \`brew install php${newversion}\` first." | |
exit 1 | |
fi |
This comment has been minimized.
This comment has been minimized.
laxbobber
commented
Oct 17, 2016
Thanks for doing this! For me, the "non-root homebrew Apache" was running as root so I had to change line 76 (httpd -k restart > /dev/null 2>&1) to be "sudo httpd -k restart > /dev/null 2>&1". Maybe I've got something else wrong that's causing httpd to run as root but FYI to others. I thought it wasn't working properly when looking at phpinfo() refreshes but it was just that apache wasn't restarting. |
This comment has been minimized.
This comment has been minimized.
crecabar
commented
Nov 6, 2016
The script is a great contribution, as an improvement, it also should update the current PATH, so the php version used on command line match the version used with apache, so the version used with composer or phpunit is the same as the used for the web server. With this command the path will be updated, the trick it is to change php55 for the version loaded and in .bash_profile (or .bashrc), change it for a variable that match the current version.
|
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
moismailzai
commented
Apr 5, 2017
•
Great script, I've added a few modifications here: https://gist.github.com/moismailzai/765007c45f908085ec5807e4463606b1 Specifically, I've added a symlink to the currently active php.ini and am running tests for orphaned conf.d/*.ini files that are leftover by uninstalled modules and which cause php CLI to complain (thanks @benkmugo for the sed regex!). I've also added a check for homebrew mariadb, which gets stopped by the switching script and needs to be restarted. Feel free to include any of that in your gist. PS, I don't think the check you do on line 73 is working correctly:
It looks like everything after "Cellar|opt" is being ignored (so the code block always runs). You can test in console: Correctly yields 0 (non error status):
Incorrectly yields 0 (because no such process exists):
Correctly yields 1 (error status):
|
This comment has been minimized.
This comment has been minimized.
yushine
commented
Aug 31, 2017
Good job. Thanks. |
This comment has been minimized.
This comment has been minimized.
dl-at-i22
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: https://getgrav.org/blog/macos-sierra-apache-multiple-php-versions so i am using the brew httpd and brew does not want to start httpd with sudo or at least its not recommended. didnt u experience some problems? wouldnt it be better to restart the brew apache with "brew services stop httpd" and "brew services start httpd"? |
This comment has been minimized.
This comment has been minimized.
jdoubleu
commented
Dec 1, 2017
For macOS users this script might act a bit different. The |
This comment has been minimized.
This comment has been minimized.
narnigrin
commented
Dec 12, 2017
Hint for macOS High Sierra users: If you run into |
This comment has been minimized.
This comment has been minimized.
vukanac
commented
Apr 20, 2018
|
This comment has been minimized.
This comment has been minimized.
maskedjellybean
commented
Dec 21, 2018
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
Call it like so: |
This comment has been minimized.
wimleers commentedOct 17, 2016
Can you also make this update
PHP_INI_SCAN_DIR
? Like so: