在Linux环境中,将PHP的不同运行形态拆开安装是一种提升系统可维护性的做法。所谓分离安装,通常是指把PHP命令行(CLI)、PHP-FPM(用于FastCGI通信)以及可能的Apache模块各自独立构建或部署,而不是通过一条命令装好整个php套件。这种方式在需要精细控制版本、扩展或资源隔离时尤其有用。

为什么要分离安装PHP
传统方式下,使用apt或yum安装php会顺带装上php-cli、php-fpm、php-common等一整套包。当业务只需要命令行脚本执行环境,或者只需要FPM对外提供服务时,多余组件不仅占用空间,还会在升级时引发依赖冲突。例如更新php-fpm可能会强制刷新cli版本,导致定时任务脚本行为变化。
分离安装允许我们为不同用途选用不同编译参数。CLI版本可以关闭很多网络相关扩展以加快启动,FPM版本则开启opcache与适当的进程管理。两者共享同一个php.ini基础配置目录,但通过独立配置文件覆盖差异项,运维边界更清晰。
从源码编译独立的PHP CLI
我们先从源码编译一个纯CLI的PHP,不启用FPM。这样能得到干净的解释器二进制文件,放在自定义目录避免覆盖系统原有php。
下面示例基于PHP 8.2源码,仅开启必要选项。注意代码中所有小于号都做了转义处理。
# 下载并解压源码 wget https://www.php.net/distributions/php-8.2.10.tar.gz tar -zxvf php-8.2.10.tar.gz cd php-8.2.10 # 配置仅CLI,关闭FPM与大部分网络扩展 ./configure --prefix=/opt/php-cli --enable-cli --disable-fpm --without-pear --enable-mbstring --with-curl make -j$(nproc) make install # 验证 /opt/php-cli/bin/php -v
上述脚本把CLI装到了/opt/php-cli,不会触碰系统/usr/bin/php。如果以后要跑离线脚本,直接调用该路径即可。编译时我们显式写了--disable-fpm,从根源上切开了与FastCGI的关联。
单独构建PHP-FPM并复用扩展
接下来编译第二份PHP,这次只生成FPM,且指定与CLI相同的扩展目录,让两边加载同一批so文件,减少重复维护。
核心思路是--enable-fpm配合--with-config-file-scan-dir指向统一扫描路径。以下代码演示了如何操作,其中大于号也做了转义。
cd php-8.2.10 make clean ./configure --prefix=/opt/php-fpm --enable-fpm --disable-cli --with-config-file-scan-dir=/opt/php-shared/conf.d --enable-mbstring --with-curl make -j$(nproc) make install # 复制基础配置 mkdir -p /opt/php-shared/conf.d cp php.ini-production /opt/php-fpm/lib/php.ini
这样FPM的二进制在/opt/php-fpm/sbin/php-fpm,它启动后会读取/opt/php-shared/conf.d下的额外ini。我们在CLI侧也设置相同scan目录,就能保证两边扩展一致。若某扩展仅FPM需要,放进独立ini即可。
让Web服务器对接独立的FPM
Nginx并不直接执行PHP,而是把请求转发给FPM。分离安装后,我们修改Nginx站点配置,使用Unix socket而非端口,提升本地通信效率。
编辑FPM池配置/opt/php-fpm/etc/php-fpm.d/www.conf,设置监听路径:
[www] listen = /run/php-fpm/php-fpm.sock listen.owner = www-data listen.group = www-data pm = dynamic pm.max_children = 50
对应Nginx片段如下,注意fastcgi_pass指向了sock文件:
server {
listen 80;
root /var/www/html;
location ~ .php$ {
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
启动FPM后,Web请求就会由独立进程池处理,即使CLI版本因脚本错误崩溃,也不影响线上接口。这种隔离在排查内存泄漏时特别有帮助,因为你能单独重启FPM而不动其他组件。
常见误区与维护建议
有人以为分离安装就是装两次包管理器里的php,结果造成libphp冲突。真正干净的做法是源码编译或容器镜像分层。另外,两边php版本必须完全一致,否则共享扩展so会报ABI错误。
建议把编译参数写成脚本纳入版本库,每次更新只需调整前缀与版本号。用systemd分别管理php-fpm与cli定时任务,日志路径也分开,能进一步降低排障成本。当业务迁移到Kubernetes时,CLI可进Job镜像,FPM进Deployment镜像,天然契合分离理念。
LinuxPHPseparate_installation修改时间:2026-08-08 14:45:32