必须在./configure中显式添加--enable-fpm,否则php-fpm二进制文件根本不会生成,导致后续所有fpm配置、服务注册及nginx转发均无效;该选项不可省略,其他如--with-fpm-user等为可选参数。

configure阶段漏掉--enable-fpm,php-fpm二进制根本不会生成
源码编译时若没显式启用FPM SAPI,make install后连php-fpm命令都不存在——这不是启动失败,是压根没编译出来。常见于直接抄网上旧教程,忽略PHP 7.4+默认不启用FPM的事实。
必须在./configure里带上--enable-fpm,否则后续所有配置、服务注册、Nginx转发全无意义。其他可选但非必需的参数如--with-fpm-user和--with-fpm-group可以之后再补,但--enable-fpm不可省略。
- 验证方式:编译前先
grep -r "fpm" .确认源码里有sapi/fpm目录;编译后检查/usr/local/sbin/php-fpm是否存在 - CentOS系用户注意:
--with-fpm-user别硬写www-data(Debian/Ubuntu默认),应匹配系统已有用户,比如nginx或apache - 如果configure报错
configure: error: xml2-config not found,说明libxml2-dev(Debian)或libxml2-devel(RHEL)没装,不是PHP源码问题
扩展编译后.so文件路径不对,php.ini里extension=xxx.so加载失败
源码安装的PHP默认把扩展放在/usr/local/lib/php/extensions/no-debug-non-zts-20220829/这类带TS标识的子目录下,而php.ini里的extension_dir可能还是默认值/usr/lib/php/20220829/或空值,导致extension=redis.so找不到文件。
不要手动改extension_dir路径去迁就so文件位置,应该让so文件落到php.ini期望的位置:
- 编译扩展前,先运行
php-config --extension-dir查准目标路径 - 用
pecl install redis时加-d extension_dir=$(php-config --extension-dir)参数 - 手动编译扩展(如gd、imagick)时,在
make install后检查so是否真落在php-config --extension-dir输出的目录里 - 确认
extension_dir在php.ini中已显式设置,且路径末尾**不带斜杠**(/usr/local/lib/php/extensions/no-debug-non-zts-20220829✔️,/.../20220829/❌)
systemd服务文件里ExecStart路径写死/usr/sbin/php-fpm,实际在/usr/local/sbin/
包管理器安装的PHP-FPM服务文件(如/lib/systemd/system/php-fpm.service)默认指向/usr/sbin/php-fpm,但源码安装的二进制在/usr/local/sbin/php-fpm。直接启用该服务会报Failed at step EXEC spawning /usr/sbin/php-fpm: No such file or directory。
必须新建独立的服务文件,不能复用系统自带的:
- 创建
/etc/systemd/system/php-fpm-custom.service,内容里ExecStart=/usr/local/sbin/php-fpm -y /usr/local/etc/php-fpm.conf -
php-fpm.conf路径也要同步核对:php-fpm -t会提示配置文件位置,若报错Unable to load configuration file,说明-y后跟的路径不对 - 别漏掉
RuntimeDirectory=php-fpm和RuntimeDirectoryMode=0755,否则php-fpm无法创建run目录下的pid/socket文件 - 重载后用
sudo systemctl daemon-reload && sudo systemctl start php-fpm-custom,再sudo systemctl status php-fpm-custom看真实错误
phpinfo()里看不到OPcache,但php -m显示已加载
php -m | grep opcache看到opcache,不代表Web环境生效——CLI和FPM用的是两套配置。FPM进程读的是php-fpm.conf里php_admin_value[auto_prepend_file]或php_ini_path指定的php.ini,不是CLI用的那个。
关键检查点:
- 运行
php-fpm -i | grep "Loaded Configuration File",确认它指向你修改过的php.ini(不是/usr/local/lib/php.ini就是/usr/local/etc/php.ini) - 在该
php.ini里确保有zend_extension=opcache.so(不是extension=opcache.so),且路径正确 -
opcache.enable=1和opcache.enable_cli=0是合理组合:Web启用,CLI关闭 - 改完配置必须
sudo systemctl restart php-fpm-custom,phpinfo()页面刷新才生效,php -v看不到opcache状态
php-config --prefix、php-config --extension-dir、php-fpm -t,比反复重启服务更省时间。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











