PHP-FPM 必须正常运行,ThinkPHP 才能执行;先用 ps aux | grep php-fpm 或 systemctl is-active 验证进程状态,再检查配置语法、权限、监听地址及 Nginx fastcgi_pass 与参数是否匹配。

PHP-FPM 进程没在跑,ThinkPHP 就根本没机会执行 —— 先确认它活着,再查其他。
怎么快速判断 PHP-FPM 是否运行中
别急着翻日志或改配置,先看进程有没有起来。很多问题其实卡在这一步,但人总下意识跳过去查 index.php 或路由。
- 执行
ps aux | grep php-fpm,看到至少一个master进程和若干worker进程才算正常 - 如果只看到
grep自己那行,说明没启动;如果只有master没worker,可能是启动失败后自动退出了 - 用
systemctl is-active php-fpm(CentOS/RHEL)或systemctl is-active php8.1-fpm(Ubuntu/Debian,版本号要对得上)更直接,返回active才算真 running
为什么 PHP-FPM 启动失败又不报错
常见原因是配置文件语法错误或权限不对,但它往往静默退出,systemctl start 看似成功,实际没起来。
- 检查
php-fpm.conf和www.conf里listen地址是否被 Nginx/Apache 占用(比如127.0.0.1:9000冲突),改成/run/php/php8.1-fpm.sock更稳妥 -
user和group设置必须是真实存在的系统用户(如www-data或nginx),不能写成apache却没这个用户 - 运行
php-fpm -t可验证配置语法,报错会明确指出哪行有问题;别跳过这步
Nginx 转发到 PHP-FPM 的关键配置项
即使 PHP-FPM 活着,Nginx 配错了也等于白搭。ThinkPHP 的 public/index.php 入口依赖正确的 fastcgi_param 传递。
立即学习“PHP免费学习笔记(深入)”;
-
fastcgi_pass必须和 PHP-FPM 的listen完全一致(socket 路径或 IP:端口) - 务必包含
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;—— 缺这个,$_SERVER['SCRIPT_FILENAME']为空,ThinkPHP 直接报 500 - 推荐用
try_files $uri /index.php?$query_string;替代旧式if (!-e $request_filename),避免重写陷阱
日志里看不到错误?先开 PHP-FPM 的 error_log
默认 PHP-FPM 错误可能只打到系统日志,或者压根没开,导致你对着空白的 access.log 干瞪眼。
- 在
php-fpm.conf中确认error_log = /var/log/php-fpm/error.log已设置,且该路径目录存在、PHP-FPM 用户有写权限 - 同时检查
log_level = notice(别设成warning或更高,会漏掉启动阶段的关键提示) - 出问题时,
tail -f /var/log/php-fpm/error.log+systemctl restart php-fpm是最快定位手段
最常被忽略的是:PHP-FPM 用户对 ThinkPHP 项目目录没有读取权限,尤其 runtime/ 目录不可写时,它连初始化都失败,但错误可能只藏在 error.log 最底下一行。



















