#!/usr/bin/env bash # PHP Installer # Min. Requirement : GNU/Linux Ubuntu 18.04 # Last Build : 11/12/2021 # Author : MasEDI.Net (me@masedi.net) # Since Version : 1.0.0 # Include helper functions. if [[ "$(type -t run)" != "function" ]]; then BASE_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd ) # shellcheck disable=SC1091 . "${BASE_DIR}/helper.sh" fi # Make sure only root can run this installer script. requires_root # Make sure only supported distribution can run this installer script. preflight_system_check ## # Add PHP repository. ## function add_php_repo() { echo "Add Ondrej's PHP repository..." DISTRIB_NAME=${DISTRIB_NAME:-$(get_distrib_name)} RELEASE_NAME=${RELEASE_NAME:-$(get_release_name)} case "${DISTRIB_NAME}" in debian) if [[ ! -f "/etc/apt/sources.list.d/ondrej-php-${RELEASE_NAME}.list" ]]; then run touch "/etc/apt/sources.list.d/ondrej-php-${RELEASE_NAME}.list" run bash -c "echo 'deb https://packages.sury.org/php/ ${RELEASE_NAME} main' > /etc/apt/sources.list.d/ondrej-php-${RELEASE_NAME}.list" run wget -qO /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg else info "PHP package repository already exists." fi ;; ubuntu) if [[ ! -f "/etc/apt/sources.list.d/ondrej-php-${RELEASE_NAME}.list" ]]; then run apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 14AA40EC0831756756D7F66C4F4EA0AAE5267A6C run add-apt-repository -y ppa:ondrej/php else info "PHP package repository already exists." fi ;; *) fail "Unable to install PHP, this GNU/Linux distribution is not supported." ;; esac info "Updating repository..." run apt-get update -qq -y } ## # Install PHP and extensions. ## function install_php() { export PHP_IS_INSTALLED="no" # PHP version. local PHPv="${1}" if [[ -z "${PHPv}" ]]; then PHPv=${DEFAULT_PHP_VERSION:-"7.4"} fi # Checking if PHP already installed. if [[ -n $(command -v "php${PHPv}") ]]; then PHP_IS_INSTALLED="yes" info "PHP ${PHPv} and it's extensions already exists." else echo "Installing PHP ${PHPv} and required extensions..." local PHP_EXTS=() local PHP_PECL_EXTS=() local PHP_REPO_EXTS=() && \ read -r -a PHP_REPO_EXTS <<< "${PHP_EXTENSIONS}" # Read additional PHP extensions from .env variable. # Check additional PHP extensions availability. for EXT_NAME in "${PHP_REPO_EXTS[@]}"; do echo "Checking additional PHP extension: ${EXT_NAME}..." if apt-cache search "php${PHPv}-${EXT_NAME}" | grep -c "php${PHPv}-${EXT_NAME}" > /dev/null; then PHP_EXTS+=("php${PHPv}-${EXT_NAME}") elif apt-cache search "php-${EXT_NAME}" | grep -c "php-${EXT_NAME}" > /dev/null; then PHP_EXTS+=("php-${EXT_NAME}") else PHP_PECL_EXTS+=("${EXT_NAME}") fi done PHP_EXTS+=("php${PHPv}" "php${PHPv}-bcmath" "php${PHPv}-bz2" "php${PHPv}-calendar" "php${PHPv}-cli" \ "php${PHPv}-common" "php${PHPv}-curl" "php${PHPv}-dev" "php${PHPv}-exif" "php${PHPv}-fpm" "php${PHPv}-gd" \ "php${PHPv}-gettext" "php${PHPv}-gmp" "php${PHPv}-gnupg" "php${PHPv}-iconv" "php${PHPv}-imap" "php${PHPv}-intl" \ "php${PHPv}-mbstring" "php${PHPv}-mysql" "php${PHPv}-opcache" "php${PHPv}-pdo" "php${PHPv}-pgsql" "php${PHPv}-posix" \ "php${PHPv}-pspell" "php${PHPv}-readline" "php${PHPv}-redis" "php${PHPv}-ldap" "php${PHPv}-snmp" "php${PHPv}-soap" \ "php${PHPv}-sqlite3" "php${PHPv}-tidy" "php${PHPv}-tokenizer" "php${PHPv}-xml" "php${PHPv}-xmlrpc" "php${PHPv}-xsl" \ "php${PHPv}-zip" dh-php php-pear php-xml pkg-php-tools fcgiwrap spawn-fcgi) # Install PHP and PHP extensions. if [[ "${#PHP_EXTS[@]}" -gt 0 ]]; then run apt-get install -qq -y "${PHP_EXTS[@]}" fi # Install PHP extensions from PECL. echo "Installing PHP extensions from PECL..." # Remove json extension from PHP greater than 7.4. It is now always available. if [[ $(bc -l <<< "${PHPv} > 7.4") == 1 ]]; then PHP_PECL_EXTS=("${PHP_PECL_EXTS[@]/json/}") fi run pecl channel-update pear.php.net if [[ "${#PHP_PECL_EXTS[@]}" -gt 0 ]]; then run pecl -d "php_suffix=${PHPv}" install "${PHP_PECL_EXTS[@]}" fi # Install additional PHP extensions. [[ "${INSTALL_MEMCACHED}" == true ]] && install_php_memcached "${PHPv}" [[ "${INSTALL_MONGODB}" == true ]] && install_php_mongodb "${PHPv}" if [[ -n $(command -v "php${PHPv}") ]]; then TOTAL_EXTS=$((${#PHP_EXTS[@]} + ${#PHP_PECL_EXTS[@]})) success "PHP ${PHPv} along with ${TOTAL_EXTS} extensions installed." fi # Enable GeoIP module. if [[ "${PHP_PECL_EXTS[*]}" =~ "geoip" ]]; then echo "Updating PHP ini file with GeoIP extension..." [[ ! -f "/etc/php/${PHPv}/mods-available/geoip.ini" ]] && \ run touch "/etc/php/${PHPv}/mods-available/geoip.ini" run bash -c "echo extension=geoip.so > /etc/php/${PHPv}/mods-available/geoip.ini" if [[ ! -f "/etc/php/${PHPv}/cli/conf.d/20-geoip.ini" ]]; then run ln -s "/etc/php/${PHPv}/mods-available/geoip.ini" \ "/etc/php/${PHPv}/cli/conf.d/20-geoip.ini" fi if [[ ! -f "/etc/php/${PHPv}/fpm/conf.d/20-geoip.ini" ]]; then run ln -s "/etc/php/${PHPv}/mods-available/geoip.ini" \ "/etc/php/${PHPv}/fpm/conf.d/20-geoip.ini" fi fi # Enable Mcrypt module. if [[ "${PHP_PECL_EXTS[*]}" =~ "mcrypt" ]]; then echo "Updating PHP ini file with Mcrypt extension..." [[ ! -f "/etc/php/${PHPv}/mods-available/mcrypt.ini" ]] && \ run touch "/etc/php/${PHPv}/mods-available/mcrypt.ini" run bash -c "echo extension=mcrypt.so > /etc/php/${PHPv}/mods-available/mcrypt.ini" if [[ ! -f "/etc/php/${PHPv}/cli/conf.d/20-mcrypt.ini" ]]; then run ln -s "/etc/php/${PHPv}/mods-available/mcrypt.ini" \ "/etc/php/${PHPv}/cli/conf.d/20-mcrypt.ini" fi if [[ ! -f "/etc/php/${PHPv}/fpm/conf.d/20-mcrypt.ini" ]]; then run ln -s "/etc/php/${PHPv}/mods-available/mcrypt.ini" \ "/etc/php/${PHPv}/fpm/conf.d/20-mcrypt.ini" fi fi # Create PHP log dir. if [[ ! -d /var/log/php ]]; then run mkdir -p /var/log/php fi # Optimize PHP & FPM configuration. optimize_php_fpm "${PHPv}" fi } ## # Restart PHP-FPM service. ## function restart_php_fpm() { # PHP version. local PHPv="${1}" if [[ -z "${PHPv}" ]]; then PHPv=${DEFAULT_PHP_VERSION:-"7.4"} fi # Restart PHP-FPM service. if [[ "${DRYRUN}" != true ]]; then if [[ $(pgrep -c "php-fpm${PHPv}") -gt 0 ]]; then run systemctl reload "php${PHPv}-fpm" success "php${PHPv}-fpm reloaded successfully." elif [[ -n $(command -v "php${PHPv}") ]]; then run systemctl start "php${PHPv}-fpm" if [[ $(pgrep -c "php-fpm${PHPv}") -gt 0 ]]; then success "php${PHPv}-fpm started successfully." else error "Something goes wrong with PHP ${PHPv} & FPM installation." fi fi else info "php${PHPv}-fpm reloaded in dry run mode." fi } ## # PHP & FPM Optimization. ## function optimize_php_fpm() { # PHP version. local PHPv="${1}" if [[ -z "${PHPv}" ]]; then PHPv=${DEFAULT_PHP_VERSION:-"7.4"} fi echo "Optimizing PHP ${PHPv} & FPM configuration..." if [[ ! -d "/etc/php/${PHPv}/fpm" ]]; then run mkdir -p "/etc/php/${PHPv}/fpm" fi # Copy the optimized-version of php.ini if [[ -f "etc/php/${PHPv}/fpm/php.ini" ]]; then run mv "/etc/php/${PHPv}/fpm/php.ini" "/etc/php/${PHPv}/fpm/php.ini~" run cp -f "etc/php/${PHPv}/fpm/php.ini" "/etc/php/${PHPv}/fpm/" else if [[ "${DRYRUN}" != true ]]; then cat >> "/etc/php/${PHPv}/fpm/php.ini" <> "/etc/php/${PHPv}/fpm/pool.d/www.conf" < "/etc/php/${PHPv}/fpm/pool.d/${POOLNAME}.conf" <> /home/${LEMPER_USERNAME}/.bashrc" run bash -c "echo '[ -d \"\$HOME/.composer/vendor/bin\" ] && export PATH=\"\$PATH:\$HOME/.composer/vendor/bin\"' >> /home/${LEMPER_USERNAME}/.bash_profile" run bash -c "echo '[ -d \"\$HOME/.composer/vendor/bin\" ] && export PATH=\"\$PATH:\$HOME/.composer/vendor/bin\"' >> /home/${LEMPER_USERNAME}/.profile" fi else error "Invalid PHP Composer installer signature." fi fi #run rm composer-setup.php run cd "${CURRENT_DIR}" || error "Cannot change directory to ${CURRENT_DIR}." fi if [[ -n $(command -v composer) ]]; then success "PHP Composer successfully installed." else error "Something went wrong with PHP Composer installation." fi fi } ## # Install PHP MongoDB extension. ## function install_php_mongodb() { # PHP version. local PHPv="${1}" if [[ -z "${PHPv}" ]]; then PHPv=${DEFAULT_PHP_VERSION:-"7.4"} fi echo -e "\nInstalling PHP ${PHPv} MongoDB extension..." run apt-get install -qq -y "php${PHPv}-mongodb" #local CURRENT_DIR && \ #CURRENT_DIR=$(pwd) #run cd "${BUILD_DIR}" || return 1 #if [[ ! -d "${BUILD_DIR}/php-${PHPv}-mongodb" ]]; then # run git clone --depth=1 -q https://github.com/mongodb/mongo-php-driver.git #fi #run cd mongo-php-driver && \ #run git submodule update --init #if [[ -n $(command -v "php${PHPv}") ]]; then # run "/usr/bin/phpize${PHPv}" && \ # run ./configure --with-php-config="/usr/bin/php-config${PHPv}" #else # run /usr/bin/phpize && \ # run ./configure #fi #run make all && \ #run make install PHP_LIB_DIR=$("php-config${PHPv}" | grep -wE "\--extension-dir" | cut -d'[' -f2 | cut -d']' -f1) if [ -f "${PHP_LIB_DIR}/mongodb.so" ]; then success "MongoDB module sucessfully installed at ${PHP_LIB_DIR}/mongodb.so." run chmod 0644 "${PHP_LIB_DIR}/mongodb.so" fi #run cd "${CURRENT_DIR}" || return 1 } ## # Install PHP Memcached extension. ## function install_php_memcached() { # PHP version. local PHPv="${1}" if [[ -z "${PHPv}" ]]; then PHPv=${DEFAULT_PHP_VERSION:-"7.4"} fi # Install PHP memcached module. echo "Installing PHP ${PHPv} memcached extension..." if [[ "${DRYRUN}" != true ]]; then run apt-get install -qq -y "php${PHPv}-igbinary" "php${PHPv}-memcache" \ "php${PHPv}-memcached" "php${PHPv}-msgpack" else info "PHP ${PHPv} Memcached extension installed in dry run mode." fi echo "Optimizing PHP ${PHPv} memcached extension..." # Optimize PHP memcache extension. if [[ "${DRYRUN}" != true ]]; then if [ -d "/etc/php/${PHPv}/mods-available/" ]; then if [ -f "/etc/php/${PHPv}/mods-available/memcache.ini" ]; then cat >> "/etc/php/${PHPv}/mods-available/memcache.ini" < "/etc/php/${PHPv}/mods-available/ioncube.ini" < "/etc/php/${PHPv}/mods-available/sourceguardian.ini" <