PHP-FPM 启动方式与常见坑位记录
PHP-FPM 启动方式与常见坑位记录
记录一次真实踩坑经历:php-fpm 启动参数错误,导致 php.ini 未加载,Redis 扩展失效,最终出现
Class 'Redis' not found。适用环境:PHP 7.x(尤其是 7.0–7.2)、手工编译 PHP、非 systemd 默认安装场景。
一、背景问题现象
服务器 Redis 为 哨兵(Sentinel)模式
PHP 使用
\Redis扩展代码未改动,仅重启服务后:
Class 'Redis' not found
排查过程中发现:
CLI 下
php -m有 redis 扩展php-fpm 启动正常,端口可用
业务接口中:
extension_loaded('redis'); // false class_exists('Redis'); // false phpinfo(); // 未找到 redis
二、问题根因(核心结论)
❌ 错误的 php-fpm 启动方式
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php-fpm.conf
错误点:
-c参数 只用于指定php.ini误把
php-fpm.conf当成php.ini结果:php-fpm 启动时完全没有加载 php.ini
直接后果:
extension = redis.so不生效所有 PHP 扩展均不可用
FPM 能跑,但环境是“残缺的”
三、关键概念区分(必须牢记)
1️⃣ php.ini
作用:
加载 PHP 扩展(redis、pdo、mbstring 等)
PHP 运行时配置
示例:
extension = redis.so
2️⃣ php-fpm.conf
作用:
FPM 主配置
include 各个 pool(www.conf 等)
不负责加载扩展
3️⃣ php-fpm pool 配置(www.conf)/)
作用:
定义监听端口 / socket
定义 worker 运行用户
示例:
listen = 127.0.0.1:9000
user = www
group = www
四、正确的 php-fpm 启动方式(重要)
✅ 推荐方式一(最安全)
/usr/local/php/sbin/php-fpm
前提:
编译 PHP 时指定了:
--with-config-file-path=/usr/local/php/etc默认会加载:
/usr/local/php/etc/php.ini
✅ 推荐方式二(显式指定 php.ini)
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini
⚠️ 注意:
-c只能指向 php.ini绝不能指向
php-fpm.conf
❌ 错误方式(高危)
php-fpm -c php-fpm.conf
后果:
php.ini 不加载
扩展全部失效
问题极难排查
五、如何快速自检 php-fpm 是否加载了 php.ini
1️⃣ 命令行检查
/usr/local/php/sbin/php-fpm -i | grep "Loaded Configuration File"
正确示例:
Loaded Configuration File => /usr/local/php/etc/php.ini
2️⃣ 扩展检查
/usr/local/php/sbin/php-fpm -i | grep -i redis
3️⃣ 业务接口自检(推荐保留)
<?php
var_dump(php_ini_loaded_file());
var_dump(extension_loaded('redis'));
var_dump(class_exists('Redis'));
六、为什么问题常在“重启后”出现?
重启前:
老 php-fpm worker 仍在内存中
扩展已加载
重启后:
新 worker 按启动参数重新加载
错误参数导致 php.ini 未加载
问题立即暴露
👉 重启不是原因,而是“触发器”
七、经验总结(血的教训)
php-fpm 的
-c参数 = php.iniphp-fpm.conf ≠ php.ini
扩展异常,优先检查:php-fpm 实际加载了哪个 ini
八、最佳实践建议
不要手敲 php-fpm 启动命令
- 使用 systemd / init.d
CLI / FPM 使用同一套 PHP
保留一个 phpinfo / 自检接口
升级 PHP(≥7.4)可显著减少此类问题
九、适用关键词(便于以后搜索)
php-fpm 启动方式
php-fpm -c 参数
Class Redis not found
php.ini 未加载
redis 扩展不生效
php-fpm 重启后异常
本文源自一次真实生产事故排查记录,问题本身不复杂,但非常隐蔽,值得长期留档。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu