├── .github └── workflows │ └── ci.yml ├── .gitignore ├── LICENSE ├── README.md ├── _config.yml └── phpswitch.sh /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: "CI" 2 | 3 | on: 4 | pull_request: 5 | push: 6 | 7 | jobs: 8 | tests: 9 | runs-on: 'macos-latest' 10 | 11 | continue-on-error: true 12 | 13 | strategy: 14 | fail-fast: true 15 | matrix: 16 | php-version: 17 | - '5.6' 18 | - '7.0' 19 | - '7.1' 20 | - '7.2' 21 | - '7.3' 22 | - '7.4' 23 | - '8.0' 24 | 25 | steps: 26 | - name: "Checkout code" 27 | uses: actions/checkout@v2.3.3 28 | 29 | - run: | 30 | set -xe 31 | 32 | brew --version 33 | brew tap shivammathur/php 34 | brew install shivammathur/php/php@${{ matrix.php-version }} 35 | ./phpswitch.sh ${{ matrix.php-version }} -s 36 | switched=$(php -v | grep -e '^PHP' | cut -d' ' -f2 | cut -d. -f1,2) 37 | if [ "${{ matrix.php-version }}" != "$switched" ]; then 38 | echo "Expected ${{ matrix.php-version }} got $switched" 39 | exit 1 40 | fi 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .idea/ 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Phil Cook 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Brew PHP Switcher [![CI](https://github.com/philcook/brew-php-switcher/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/philcook/brew-php-switcher/actions/workflows/ci.yml) 2 | ========= 3 | 4 | Brew PHP switcher is a simple script to switch your Apache and CLI configs quickly between major versions of PHP. 5 | 6 | If you support multiple products/projects that are built using either brand new or old legacy PHP functionality and you find it a pain to change config files continually this will make the whole process just one command. 7 | 8 | Caveats 9 | ------- 10 | 11 | For users of OSX only who have installed PHP via [Homebrew] and for PHP version 5.6, 7.0, 7.1, 7.2, 7.3, 7.4 and 8.0 only. 12 | 13 | Your Apache config must have native osx PHP module commented out. 14 | ```sh 15 | #LoadModule php5_module libexec/apache2/libphp5.so 16 | ``` 17 | 18 | Brew PHP Switcher will automatically add the [Homebrew]'s PHP module location in the Apache config in the following format. 19 | ```sh 20 | #LoadModule php5_module /usr/local/opt/php@5.6/lib/httpd/modules/libphp5.so 21 | #LoadModule php7_module /usr/local/opt/php@7.0/lib/httpd/modules/libphp7.so 22 | #LoadModule php7_module /usr/local/opt/php@7.1/lib/httpd/modules/libphp7.so 23 | #LoadModule php7_module /usr/local/opt/php@7.2/lib/httpd/modules/libphp7.so 24 | #LoadModule php7_module /usr/local/opt/php@7.3/lib/httpd/modules/libphp7.so 25 | #LoadModule php7_module /usr/local/opt/php@7.4/lib/httpd/modules/libphp7.so 26 | #LoadModule php7_module /usr/local/opt/php@8.0/lib/httpd/modules/libphp8.so 27 | ``` 28 | 29 | Version 30 | ---- 31 | 32 | 2.3 33 | 34 | Installation 35 | -------------- 36 | ```sh 37 | brew install brew-php-switcher 38 | ``` 39 | 40 | Where **5.6** exists, please replace with syntax of **5.6**, **7.0**, **7.1**, **7.2**, **7.3**, **7.4**, **8.0**, **8.1**, **8.2**, **8.3** or **8.4** depending on which version is required. 41 | ```sh 42 | brew-php-switcher 5.6 43 | ``` 44 | 45 | > by default will switch apache config 46 | 47 | Options 48 | -------------- 49 | 50 | - `-s|-s=*` Skips apache & valet config switch for i.e 51 | 52 | ```sh 53 | # skip apache only 54 | brew-php-switcher 5.6 -s 55 | 56 | # skip valet only 57 | brew-php-switcher 5.6 -s=valet 58 | 59 | # skip valet & apache 60 | brew-php-switcher 5.6 -s=valet,apache 61 | ``` 62 | - `-c=*` switch a specific config for i.e 63 | 64 | ```sh 65 | # switch valet config only 66 | brew-php-switcher 5.6 -c=valet 67 | 68 | # switch valet & apache config only 69 | brew-php-switcher 5.6 -c=valet,apache 70 | 71 | # switch apache config only 72 | brew-php-switcher 5.6 -c=apache 73 | ``` 74 | 75 | License 76 | ---- 77 | 78 | MIT 79 | 80 | [Homebrew]:http://brew.sh/ 81 | [@p_cook]:http://twitter.com/p_cook 82 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-minimal -------------------------------------------------------------------------------- /phpswitch.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Creator: Phil Cook 3 | # Email: phil@phil-cook.com 4 | # Twitter: @p_cook 5 | osx_major_version=$(sw_vers -productVersion | cut -d. -f1) 6 | osx_minor_version=$(sw_vers -productVersion | cut -d. -f2) 7 | osx_patch_version=$(sw_vers -productVersion | cut -d. -f3) 8 | osx_version=$((${osx_major_version} * 10000 + ${osx_minor_version} * 100 + ${osx_patch_version:-0})) 9 | 10 | brew_prefix=$(brew --prefix | sed 's#/#\\\/#g') 11 | 12 | brew_array=("5.6" "7.0" "7.1" "7.2" "7.3" "7.4" "8.0" "8.1" "8.2", "8.3", "8.4") 13 | php_array=("php@5.6" "php@7.0" "php@7.1" "php@7.2" "php@7.3" "php@7.4" "php@8.0" "php@8.1" "php@8.2" "php@8.3" "php@8.4") 14 | valet_support_php_version_array=("php@5.6" "php@7.0" "php@7.1" "php@7.2" "php@7.3" "php@7.4" "php@8.0" "php@8.1" "php@8.2" "php@8.3" "php@8.4") 15 | php_installed_array=() 16 | php_version="php@$1" 17 | php_opt_path="$brew_prefix\/opt\/" 18 | 19 | php5_module="php5_module" 20 | apache_php5_lib_path="\/lib\/httpd\/modules\/libphp5.so" 21 | php7_module="php7_module" 22 | apache_php7_lib_path="\/lib\/httpd\/modules\/libphp7.so" 23 | php8_module="php_module" 24 | apache_php8_lib_path="\/lib\/httpd\/modules\/libphp.so" 25 | 26 | native_osx_php_apache_module="LoadModule ${php5_module} libexec\/apache2\/libphp5.so" 27 | if [ "${osx_version}" -ge "101300" ]; then 28 | native_osx_php_apache_module="LoadModule ${php7_module} libexec\/apache2\/libphp7.so" 29 | fi 30 | 31 | php_module="$php5_module" 32 | apache_php_lib_path="$apache_php5_lib_path" 33 | 34 | # Has the user submitted a version required 35 | if [[ -z "$1" ]]; then 36 | echo "usage: brew-php-switcher version [-s|-s=*] [-c=*]" 37 | echo 38 | echo " version one of:" ${brew_array[@]} 39 | echo " -s skip change of mod_php on apache" 40 | echo " -s=* skip change of mod_php on apache or valet restart i.e (apache|valet,apache|valet)" 41 | echo " -c=* switch a specific config (apache|valet,apache|valet" 42 | echo 43 | exit 44 | fi 45 | 46 | if [[ $(echo "$php_version" | sed 's/^php@//' | sed 's/\.//') -ge 80 ]]; then 47 | php_module="$php8_module" 48 | apache_php_lib_path="$apache_php8_lib_path" 49 | elif [[ $(echo "$php_version" | sed 's/^php@//' | sed 's/\.//') -ge 70 ]]; then 50 | php_module="$php7_module" 51 | apache_php_lib_path="$apache_php7_lib_path" 52 | fi 53 | 54 | apache_change=1 55 | apache_conf_path="/etc/apache2/httpd.conf" 56 | apache_php_mod_path="$php_opt_path$php_version$apache_php_lib_path" 57 | 58 | valet_restart=0 59 | # Check if valet is already install 60 | hash valet 2>/dev/null && valet_installed=1 || valet_installed=0 61 | 62 | POSITIONAL=() 63 | 64 | # Check for skip & change flag 65 | while [[ $# -gt 0 ]]; do 66 | key="$1" 67 | case "$key" in 68 | # This is a flag type option. Will catch either -s or --skip 69 | -s|-s=*|--skip=*) 70 | if [[ "${1#*=}" == "-s" || "${1#*=}" == *"apache"* ]]; then 71 | apache_change=0 72 | elif [ "${1#*=}" == "valet" ]; then 73 | valet_restart=0 74 | fi 75 | ;; 76 | 77 | # This is a flag type option. Will catch either -c or --change 78 | -c=*|--change=*) 79 | [[ "$1" == *"apache"* ]] && apache_change=1 || apache_change=0 80 | [[ "$1" == *"valet"* ]] && valet_restart=1 || valet_restart=0 81 | ;; 82 | 83 | *) 84 | POSITIONAL+=("$1") # save it in an array for later 85 | ;; 86 | esac 87 | # Shift after checking all the cases to get the next option 88 | shift 89 | done 90 | 91 | # What versions of php are installed via brew 92 | for i in ${php_array[*]}; do 93 | if [[ -n "$(brew ls --versions "$i")" ]]; then 94 | php_installed_array+=("$i") 95 | fi 96 | done 97 | 98 | # Check if php version support via valet 99 | if [[ (" ${valet_support_php_version_array[*]} " != *"$php_version"*) && ($valet_restart -eq 1) ]]; then 100 | echo "Sorry, but $php_version is not support via valet" 101 | exit 102 | fi 103 | 104 | # Check that the requested version is supported 105 | if [[ " ${php_array[*]} " == *"$php_version"* ]]; then 106 | # Check that the requested version is installed 107 | if [[ " ${php_installed_array[*]} " == *"$php_version"* ]]; then 108 | 109 | # Switch Shell 110 | echo "Switching to $php_version" 111 | echo "Switching your shell" 112 | for i in ${php_installed_array[@]}; do 113 | brew unlink $i 114 | done 115 | brew link --force "$php_version" 116 | 117 | # Switch apache 118 | if [[ $apache_change -eq 1 ]]; then 119 | echo "You will need sudo power from now on" 120 | echo "Switching your apache conf" 121 | 122 | for j in ${php_installed_array[@]}; do 123 | loop_php_module="$php5_module" 124 | loop_apache_php_lib_path="$apache_php5_lib_path" 125 | if [ $(echo "$j" | sed 's/^php@//' | sed 's/\.//') -ge 80 ]; then 126 | loop_php_module="$php8_module" 127 | loop_apache_php_lib_path="$apache_php8_lib_path" 128 | elif [ $(echo "$j" | sed 's/^php@//' | sed 's/\.//') -ge 70 ]; then 129 | loop_php_module="$php7_module" 130 | loop_apache_php_lib_path="$apache_php7_lib_path" 131 | fi 132 | apache_module_string="LoadModule $loop_php_module $php_opt_path$j$loop_apache_php_lib_path" 133 | comment_apache_module_string="#$apache_module_string" 134 | 135 | # If apache module string within apache conf 136 | if grep -q "$apache_module_string" "$apache_conf_path"; then 137 | # If apache module string not commented out already 138 | if ! grep -q "$comment_apache_module_string" "$apache_conf_path"; then 139 | sudo sed -i.bak "s/$apache_module_string/$comment_apache_module_string/g" $apache_conf_path 140 | fi 141 | # Else the string for the php module is not in the apache config then add it 142 | else 143 | sudo sed -i.bak "/$native_osx_php_apache_module/a\\ 144 | $comment_apache_module_string\\ 145 | " $apache_conf_path 146 | fi 147 | done 148 | sudo sed -i.bak "s/\#LoadModule $php_module $apache_php_mod_path/LoadModule $php_module $apache_php_mod_path/g" $apache_conf_path 149 | echo "Restarting apache" 150 | sudo apachectl stop 151 | sudo apachectl start 152 | fi 153 | 154 | # Switch valet 155 | if [[ $valet_restart -eq 1 ]]; then 156 | if [[ $valet_installed -eq 1 ]]; then 157 | valet use $php_version --force 158 | else 159 | echo "valet isn't installed in your system, will skip restarting valet service" 160 | fi 161 | fi 162 | 163 | echo "All done!" 164 | else 165 | echo "Sorry, but $php_version is not installed via brew. Install by running: brew install $php_version" 166 | fi 167 | else 168 | echo "Unknown version of PHP. PHP Switcher can only handle arguments of:" ${brew_array[@]} 169 | fi 170 | --------------------------------------------------------------------------------