在 LAMP 的整体框架下,PHP 是以模块的形式挂接到 Apache 的。作为本系列的最后一环,我们将编译安装 PHP 8.3,并配置它与 Apache 的协同工作。同样,所有命令也写到了一个可执行文件内,可下载后执行:

wget https://blog.nyankowo.com/bash/installphp.sh && chmod +x installphp.sh  && bash installphp.sh

1. 安装预备软件

        根据每家服务商提供的系统镜像不同,系统本身所带的软件包也不相同。编译过程中缺少什么就查漏补缺安装什么。以下是常用的基础开发库:

yum install libxml2-devel sqlite-devel curl-devel libpng-devel libjpeg-devel freetype-devel libxslt-devel cmake3 ImageMagick-devel php-pecl-imagick-devel libsodium php-intl krb5-devel -y

2. 安装依赖库

2.1 安装 Oniguruma

        Oniguruma 是一个正则表达式库,PHP 的 mbstring 模块依赖于它。在 CentOS 9/Stream 中,暂时还没有 oniguruma-devel 的源,我们需要手动编译。注意 --libdir=/lib64 参数不可少,否则 PHP 可能找不到库文件:

wget https://github.com/kkos/oniguruma/releases/download/v6.9.9/onig-6.9.9.tar.gz -P /usr/local/src
tar -xvf /usr/local/src/onig-6.9.9.tar.gz -C /usr/local/src && cd /usr/local/src/onig-6.9.9
./configure --prefix=/usr/local/oniguruma --libdir=/lib64 && make && make install

2.2 安装 Libzip

        在编译 PHP 时通常会提示系统自带的 Libzip 版本过低(PHP 扩展需要更新版本的 zip 支持),所以我们需要编译一份新版的 Libzip:

wget https://libzip.org/download/libzip-1.11.1.tar.gz -P /usr/local/src
tar -xvf /usr/local/src/libzip-1.11.1.tar.gz -C /usr/local/src && cd /usr/local/src/libzip-1.11.1
cmake3 -DCMAKE_INSTALL_PREFIX=/usr/local/libzip && make && make install

2.3 编译 UW IMAP

        如果你需要使用 PHP 的 Mail 相关功能,通常需要 IMAP 支持。这是一个较老的库,需要特殊处理:

wget https://www.mirrorservice.org/sites/ftp.cac.washington.edu/imap/imap-2007f.tar.gz -P /usr/local/src
tar -xvf /usr/local/src/imap-2007f.tar.gz -C /usr/local/src && cd /usr/local/src/imap-2007f

# 针对 Linux 环境编译,忽略 SSL 类型并添加必要的链接库
make lnx SSLTYPE=none EXTRACFLAGS="-fPIC" EXTRALDFLAGS="-lcrypt"

# 手动复制头文件和库文件
mkdir -p /usr/local/c-client/include /usr/local/c-client/lib
cp -f c-client/*.h /usr/local/c-client/include/
cp -f c-client/*.c /usr/local/c-client/lib/
cp -f c-client/c-client.a /usr/local/c-client/lib/libc-client.a
ln -s /usr/local/c-client/lib/libc-client.a /usr/lib64/libc-client.so

3. 编译安装 PHP 8.3

        对于不同版本的 PHP,所用的参数有些不同。PHP 8 相比于 PHP 7 废弃了很多旧参数。以下配置集成了 Apache 模块 (apxs2)、MySQL 驱动 (mysqlnd) 以及我们刚才安装的各种依赖库:

wget https://www.php.net/distributions/php-8.3.12.tar.gz -P /usr/local/src
tar -xvf /usr/local/src/php-8.3.12.tar.gz -C /usr/local/src && cd /usr/local/src/php-8.3.12

# 编译配置 (长命令)
./configure \
--prefix=/usr/local/php \
--enable-fpm \
--with-fpm-user=apache \
--with-fpm-group=apache \
--with-mysql-sock=/usr/local/mariadb/sock/mysql.sock \
--with-config-file-path=/usr/local/php/etc \
--with-openssl \
--with-zlib \
--with-freetype \
--enable-gd \
--with-jpeg \
--enable-short-tags \
--enable-sockets \
--enable-mbstring \
--enable-soap \
--enable-static \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-mysqlnd-compression-support \
--with-curl \
--with-xsl \
--enable-ftp \
--with-libxml \
--enable-exif \
--enable-calendar \
--with-zip \
--with-sodium \
--with-imap=/usr/local/c-client \
--enable-bcmath \
--with-kerberos \
PKG_CONFIG_PATH=/usr/local/libzip/lib64/pkgconfig \
--enable-intl

# 开始编译安装
make && make install

# 收尾工作:配置 libtool 并复制配置文件
libtool --finish /usr/local/src/php-8.3.12/libs
mkdir /usr/local/php/etc && cp php.ini-production /usr/local/php/etc/php.ini

        安装完成后,建议对 PHP 配置文件 (php.ini) 进行初步修改,以适配生产环境需求(例如增加文件上传大小限制):

upload_max_filesize = 512M
memory_limit = 512M
post_max_size = 512M
max_execution_time = 300

[!WARNING] 编译时的内存问题
        编译 PHP 非常消耗内存。如果你的 VPS 内存小于 1.5GB,很可能会报错 make: *** [Makefile:909: ext/fileinfo/libmagic/apprentice.lo] Error 1。此时需要临时增加 SWAP(交换空间)来解决:

  1. 查看当前 swap:free -h
  2. 创建 4GB 交换文件:dd if=/dev/zero of=/mnt/swap bs=1M count=4096
  3. 格式化为 swap:mkswap /mnt/swap
  4. 启用 swap:swapon /mnt/swap
  5. (可选) 设置开机挂载:在 /etc/fstab 添加 /mnt/swap swap swap defaults 0 0
  6. 优化使用策略:修改 /etc/sysctl.conf 中的 vm.swappiness = 70 (表示空闲内存少于 70% 时即开始使用 SWAP)。

4. 配置 Apache 解析 PHP

        PHP 安装好后,还需要告诉 Apache 如何处理 .php 后缀的文件。打开 Apache 主配置文件 httpd.conf

  1. 加载模块:检查是否已有 LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so(通常编译安装会自动添加,确保未被注释)。
  2. 设置 Handler:在配置文件空白处(或 <IfModule mime_module> 内)添加:

    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php-fpm.sock|fcgi://localhost"
    </FilesMatch>
  3. 修改默认页:找到 <DirectoryIndex>,将 index.php 添加到 index.html 前面:

    DirectoryIndex index.php index.html
  4. 重启 Apacheapachectl restart
  5. 配置权限chown apache:apache /run/php-fpm.sock

5. 验证安装

        在网站根目录 (htdocs) 下新建一个 index.php 文件,输入以下内容:

<?php phpinfo(); ?>

        访问网站(如 http://your-ip/index.php),如果出现如下图所示的紫色配置详情页面,就说明 PHP 8.3 已成功挂载到 Apache 上,LAMP 环境搭建圆满完成!

PHPInfo页面