Skip to content

Instantly share code, notes, and snippets.

@aristipp
Created October 6, 2018 23:41
Show Gist options
  • Select an option

  • Save aristipp/f2b7674eb091c0c6082ec38e710cee77 to your computer and use it in GitHub Desktop.

Select an option

Save aristipp/f2b7674eb091c0c6082ec38e710cee77 to your computer and use it in GitHub Desktop.

Revisions

  1. aristipp created this gist Oct 6, 2018.
    169 changes: 169 additions & 0 deletions phpswitch.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,169 @@
    #!/bin/bash
    # Creator: Phil Cook
    # Email: [email protected]
    # Twitter: @p_cook
    brew_prefix=$(brew --prefix | sed 's#/#\\\/#g')

    brew_array=("5.6","7.0","7.1","7.2")
    php_array=("[email protected]" "[email protected]" "[email protected]" "[email protected]")
    valet_support_php_version_array=("[email protected]" "[email protected]" "[email protected]" "[email protected]")
    php_installed_array=()
    php_version="php@$1"
    php_opt_path="$brew_prefix\/opt\/"

    php5_module="php5_module"
    #apache_php5_lib_path="\/libexec\/apache2\/libphp5.so"
    apache_php5_lib_path="\/lib\/httpd\/modules\/libphp5.so"
    php7_module="php7_module"
    #apache_php7_lib_path="\/libexec\/apache2\/libphp7.so"
    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: brew-php-switcher 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=1
    #apache_conf_path="/etc/apache2/httpd.conf"
    apache_conf_path="/usr/local/etc/httpd/httpd.conf"
    apache_php_mod_path="$php_opt_path$php_version$apache_php_lib_path"

    valet_restart=0
    # 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 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 "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