引言

这里主要是一个一键编译安装 PHP的脚本

修订记录

序号时间修改内容
12024.04.23创建php的脚本安装文件
22024.05.13补充选项配置等

详细教程

这里的脚本是对源码编译方式进行浓缩的,如果遇到一些报错或异常

欢迎移步源码编译Nginx的教程文档

快速执行

复制下面的内容,直接粘贴到服务器的控制台即可

wget http://static.hw13.cn/usr/uploads/2024/04/php.sh && sh php.sh

注意,脚本内部有一些敏感操作,需要当前执行的用户有 sudo权限,请使用具有 sudo权限的用户执行,或使用 root用户执行

脚本正文

#! /bin/bash

# 【版本确定】要安装的PHP编译器版本
PHP_VERSION=""
# 【存放位置】要安装的PHP编译器源码包存放位置
PHP_SRC_DIR=""
# 【安装位置】要安装的PHP编译器位置
PHP_INSTALL_DIR=""
# 【用户名】PHP-FPM使用的用户名
PHP_USER=""
# 【用户名】PHP-FPM使用的用户组
PHP_GROUP=""
# 【输出开关】PHP编译器编译过程是否输出
PHP_OUTPUT=false

# 默认值
PHP_DEFAULT_USER="php"
PHP_DEFAULT_VERSION="8.3.0"
PHP_DEFAULT_SRC_DIR="/server/data/packages"
PHP_DEFAULT_OUTPUT=false

readUserInputConfig()
{
    echo "------------------------------------ PHP 脚本安装程序 ------------------------------------"
    read -p "请输入源码包存放位置(默认:${PHP_DEFAULT_SRC_DIR},不修改直接回车):" PHP_SRC_DIR
    read -p "请输入php-fpm使用的用户名(默认:${PHP_DEFAULT_USER},不修改直接回车):" PHP_USER
    read -p "请输入php-fpm使用的用户组(默认:${PHP_DEFAULT_GROUP},不修改直接回车):" PHP_GROUP
    read -p "请输入php版本号(默认:${PHP_DEFAULT_VERSION},不修改直接回车):" PHP_VERSION
    read -p "是否需要输出运行结果(默认:${PHP_DEFAULT_OUTPUT},不修改直接回车):" PHP_OUTPUT

    # 预防用户空输入
    if [[ -z ${PHP_USER} ]]
    then
        PHP_USER=$PHP_DEFAULT_USER
    fi

    # 预防用户空输入
    if [[ -z ${PHP_VERSION} ]]
    then
        PHP_VERSION=$PHP_DEFAULT_VERSION
    fi

    # 预防用户空输入
    if [[ -z ${PHP_OUTPUT} ]]
    then
        PHP_OUTPUT=$PHP_DEFAULT_OUTPUT
    fi

    PHP_DEFAULT_INSTALL_DIR="/server/php/$PHP_VERSION"
    read -p "请输入php安装位置(默认:${PHP_DEFAULT_INSTALL_DIR},不修改直接回车):" PHP_INSTALL_DIR

    # 预防用户空输入
    if [[ -z ${PHP_INSTALL_DIR} ]]
    then
        PHP_INSTALL_DIR=$PHP_DEFAULT_INSTALL_DIR
    fi

    # 预防用户空输入
    if [[ -z ${PHP_SRC_DIR} ]]
    then
        PHP_SRC_DIR=$PHP_DEFAULT_SRC_DIR
    fi

    while [[ true ]]; do
        confirmInstallConfig
        read -p "是否确认配置并进行安装(yes):" PHP_CONFIRM

        if [[ ${PHP_CONFIRM} == "yes" ]]
        then
            break
        fi
    done
    echo "现在开始安装……"
}

confirmInstallConfig()
{
    echo "---------------------------------- 安装配置确认 --------------------------------------------"

    echo "PHP-FPM的访问用户为:${PHP_USER}"
    echo "PHP的版本号为:${PHP_VERSION}"
    echo "PHP的安装位置为:${PHP_INSTALL_DIR}"
    echo "PHP的源码包存放位置为:${PHP_SRC_DIR}"
    echo "php安装过程是否需要输出:${PHP_OUTPUT}"
}

preInstall()
{
    # # 检查php是否监听80端口
    sudo ps -ef | grep php-fpm | grep -v grep
    if [ $? -eq 0 ]; then
        echo "【错误】当前php-fpm已经安装上了,无需重复安装"
        exit 1
    fi

    # 安装依赖
    sudo yum -y install cmake gcc g++ ncurses-devel \
    libtirpc-devel rpcgen libxml2-devel sqlite-devel \
    libpng-devel oniguruma-devel libcurl-devel

    if [ $? -ne 0 ]; then
        echo "【错误】安装依赖项错误"
        exit 1
    fi

    # 添加nginx用户(如果尚未存在)
    id $PHP_USER
    if [ $? -ne 0 ]; then
        sudo useradd $PHP_USER -s /sbin/nologin -M
    fi

    # 创建源码包存放目录、安装目录、配置文件存放目录
    sudo mkdir -p $PHP_SRC_DIR $PHP_INSTALL_DIR ${PHP_INSTALL_DIR}/etc
    sudo chown -R $USER.$USER $PHP_SRC_DIR
    sudo chown -R $USER.$USER $PHP_INSTALL_DIR

    if [ ! -d "$PHP_SRC_DIR" ]; then
        echo "【错误】源码包存放目录不存在,请确认!${PHP_SRC_DIR}"
        exit 1
    fi

    if [ ! -d "$PHP_INSTALL_DIR" ]; then
        echo "【错误】PHP的安装目录不存在,请确认!${PHP_INSTALL_DIR}"
        exit 1
    fi
}

# 主安装程序
main()
{
    # PHP 命令的实际路径
    PHP_COMMAND="${PHP_INSTALL_DIR}/bin/php"

    # 切换到安装包存放目录
    cd ${PHP_SRC_DIR}

    # 下载 PHP 源码包(如果需要)
    # wget https://www.php.net/distributions/php-${PHP_VERSION}.tar.gz || exit 1
    wget http://static.hw13.cn/usr/uploads/2024/php-${PHP_VERSION}.tar.gz || exit 1

    # 解压 PHP 源码包
    tar -xzvf php-${PHP_VERSION}.tar.gz || exit 1

    # 切换到 PHP 源码目录
    PHP_SRC_DIR=${PHP_SRC_DIR}/php-${PHP_VERSION}/
    cd $PHP_SRC_DIR

    # 配置 PHP 安装选项
    ./configure
    --prefix=${PHP_INSTALL_DIR}
    --with-config-file-path=${PHP_INSTALL_DIR}/etc
    --enable-fpm
    --with-gd
    --enable-gd-jis-conv
    --enable-mysqlnd
    --enable-mbstring
    --with-openssl
    --with-curl
    --with-zlib
    --with-pdo-mysql
    --with-fpm-user=${PHP_USER}
    --with-fpm-group=${PHP_GROUP}
    --with-mysqli
    --with-sockets

    # 编译并安装 PHP
    make && make install || exit 1

    # 目标软链接的路径
    TARGET_LINK="/usr/local/bin/php"
    if [ ! -e "$TARGET_LINK" ]; then
        # 如果不存在,则创建软链接
        sudo ln -s "$PHP_COMMAND" "$TARGET_LINK"
        echo "软链接已创建: $TARGET_LINK -> $PHP_COMMAND"
    else
        echo "软链接已存在: $TARGET_LINK"
    fi

    # 复制 PHP 配置文件
    cp ${PHP_SRC_DIR}/php.ini-production  ${PHP_INSTALL_DIR}/etc/php.ini

    # 启动 PHP-FPM
    cp ${PHP_SRC_DIR}/sapi/fpm/php-fpm.conf ${PHP_INSTALL_DIR}/etc/
    mv ${PHP_INSTALL_DIR}/etc/php-fpm.d/www.conf.default ${PHP_INSTALL_DIR}/etc/php-fpm.d/www.conf
    sudo ${PHP_INSTALL_DIR}/sbin/php-fpm

    # 检查 PHP-FPM 进程是否运行
    ps -ef | grep php-fpm | grep -v grep

    php --ini

    # 检查 PHP 版本
    php --version
}

# 用户输入自定义配置
readUserInputConfig

# 调用函数执行
if [[ $PHP_OUTPUT ]]; then
    # 预安装
    preInstall
    # 安装
    main
else
    # 预安装
    preInstall > /dev/null 2>&1
    # 安装
    main > /dev/null 2>&1
fi

欢迎关注拓行公众号,分享各种技术博客文章

拓行——奋勇进取,开拓未来,砥砺前行

最后修改:2024 年 05 月 13 日
如果您对各种技术博客文章感兴趣,欢迎关注拓行公众号,分享各种专业技术知识~