Created
June 22, 2019 10:20
-
-
Save arukompas/ef992dd715fc0b46ecf1e5ceef02e436 to your computer and use it in GitHub Desktop.
A bash script to switch PHP versions on your local MacOS development with Apache or Laravel Valet
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Creator: Phil Cook | |
# Modified: Andy Miller | |
# Modified: Arunas Skirius | |
brew_prefix=$(brew --prefix | sed 's#/#\\\/#g') | |
brew_array=("5.5","5.6","7.0","7.1","7.2", "7.3") | |
php_array=("php@5.5" "php@5.6" "php@7.0" "php@7.1" "php@7.2" "php@7.3") | |
valet_support_php_version_array=("php@5.5" "php@5.6" "php@7.0" "php@7.1" "php@7.2" "php@7.3") | |
php_installed_array=() | |
php_version="php@$1" | |
php_opt_path="$brew_prefix\/opt\/" | |
php5_module="php5_module" | |
apache_php5_lib_path="\/lib\/httpd\/modules\/libphp5.so" | |
php7_module="php7_module" | |
apache_php7_lib_path="\/lib\/httpd\/modules\/libphp7.so" | |
native_osx_php_apache_module="LoadModule php5_module libexec\/apache2\/libphp5.so" | |
php_module="$php5_module" | |
apache_php_lib_path="$apache_php5_lib_path" | |
# Has the user submitted a version required | |
if [[ -z "$1" ]] | |
then | |
echo "usage: sphp version [-s|-s=*] [-c=*]"; echo; | |
echo " version one of:" ${brew_array[@]}; | |
echo " -s skip change of mod_php on apache"; | |
echo " -s=* skip change of mod_php on apache or valet restart i.e (apache|valet,apache|valet)"; | |
echo " -c=* switch a specific config (apache|valet,apache|valet"; echo; | |
exit | |
fi | |
if [ $(echo "$php_version" | sed 's/^php@//' | sed 's/\.//') -ge 70 ]; then | |
php_module="$php7_module" | |
apache_php_lib_path="$apache_php7_lib_path" | |
fi | |
apache_change=0 | |
apache_conf_path="/usr/local/etc/httpd/httpd.conf" | |
apache_php_mod_path="$php_opt_path$php_version$apache_php_lib_path" | |
valet_restart=1 | |
# Check if valet is already install | |
hash valet 2>/dev/null && valet_installed=1 || valet_installed=0 | |
POSITIONAL=() | |
# Check for skip & change flag | |
while [[ $# -gt 0 ]]; do | |
key="$1" | |
case "$key" in | |
# This is a flag type option. Will catch either -s or --skip | |
-s|-s=*|--skip=*) | |
if [[ "${1#*=}" == "-s" || "${1#*=}" == *"apache"* ]]; then | |
apache_change=0 | |
elif [ "${1#*=}" == "valet" ]; then | |
valet_restart=0 | |
fi | |
;; | |
# This is a flag type option. Will catch either -c or --change | |
-c=*|--change=*) | |
[[ "$1" == *"apache"* ]] && apache_change=1 || apache_change=0 | |
[[ "$1" == *"valet"* ]] && valet_restart=1 || valet_restart=0 | |
;; | |
*) | |
POSITIONAL+=("$1") # save it in an array for later | |
;; | |
esac | |
# Shift after checking all the cases to get the next option | |
shift | |
done | |
# What versions of php are installed via brew | |
for i in ${php_array[*]} | |
do | |
if [[ -n "$(brew ls --versions "$i")" ]] | |
then | |
php_installed_array+=("$i") | |
fi | |
done | |
# Check if php version support via valet | |
if [[ (" ${valet_support_php_version_array[*]} " != *"$php_version"*) && ($valet_restart -eq 1) ]] | |
then | |
echo "Sorry, but $php_version is not support via valet"; | |
exit; | |
fi | |
# Check that the requested version is supported | |
if [[ " ${php_array[*]} " == *"$php_version"* ]] | |
then | |
# Check that the requested version is installed | |
if [[ " ${php_installed_array[*]} " == *"$php_version"* ]] | |
then | |
# Stop valet service | |
if [[ ($valet_installed -eq 1) && ($valet_restart -eq 1) ]]; then | |
echo "Stop Valet service"; | |
valet stop; | |
fi | |
# Switch Shell | |
echo "Switching to $php_version" | |
echo "Switching your shell" | |
for i in ${php_installed_array[@]} | |
do | |
if [[ -n $(brew ls --versions $i) ]] | |
then | |
brew unlink $i | |
fi | |
done | |
brew link --force "$php_version" | |
# Switch apache | |
if [[ $apache_change -eq 1 ]]; then | |
echo "You will need sudo power from now on" | |
echo "Switching your apache conf" | |
for j in ${php_installed_array[@]} | |
do | |
loop_php_module="$php5_module" | |
loop_apache_php_lib_path="$apache_php5_lib_path" | |
if [ $(echo "$j" | sed 's/^php@//' | sed 's/\.//') -ge 70 ]; then | |
loop_php_module="$php7_module" | |
loop_apache_php_lib_path="$apache_php7_lib_path" | |
fi | |
apache_module_string="LoadModule $loop_php_module $php_opt_path$j$loop_apache_php_lib_path" | |
comment_apache_module_string="#$apache_module_string" | |
# If apache module string within apache conf | |
if grep -q "$apache_module_string" "$apache_conf_path"; then | |
# If apache module string not commented out already | |
if ! grep -q "$comment_apache_module_string" "$apache_conf_path"; then | |
sudo sed -i.bak "s/$apache_module_string/$comment_apache_module_string/g" $apache_conf_path | |
fi | |
# Else the string for the php module is not in the apache config then add it | |
else | |
sudo sed -i.bak "/$native_osx_php_apache_module/a\\ | |
$comment_apache_module_string\\ | |
" $apache_conf_path | |
fi | |
done | |
sudo sed -i.bak "s/\#LoadModule $php_module $apache_php_mod_path/LoadModule $php_module $apache_php_mod_path/g" $apache_conf_path | |
echo "Restarting apache" | |
sudo apachectl restart | |
fi | |
# Switch dependencies | |
echo "Switching dependencies..." | |
if [ "$php_version" == "php@7.3" ]; then | |
brew switch icu4c 64.2 | |
else | |
brew switch icu4c 63.1 | |
fi | |
# Switch valet | |
if [[ $valet_restart -eq 1 ]]; then | |
if [[ valet_installed -eq 1 ]]; then | |
valet restart | |
else | |
echo "valet doesn't installed in your system, will skip restarting valet service"; | |
fi | |
fi | |
echo "" | |
php -v | |
echo "" | |
echo "All done!" | |
else | |
echo "Sorry, but $php_version is not installed via brew. Install by running: brew install $php_version" | |
fi | |
else | |
echo "Unknown version of PHP. PHP Switcher can only handle arguments of:" ${brew_array[@]} | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
/usr/local/bin/sphp
chmod +x /usr/local/bin/sphp
sphp <PHP_VERSION>
to change between the available PHP versions on your machine, for example -sphp 7.3
,sphp 5.6
etc