You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何PHP file_put_contents会引发NGINX「upstream prematurely closed...」错误?

解决方案:upstream prematurely closed 错误(file_put_contents触发)

这个错误本质是PHP-FPM进程在处理请求时异常终止,nginx未收到完整响应头就断开了连接,和你调整的nginx超时参数关联不大,核心要排查PHP及系统层面的问题,以下是针对性方案:

  • 检查缓存目录权限
    确保Slim缓存目录的所有者和PHP-FPM运行用户一致(通常是www-data或apache),权限至少设为755(所有者读写执行,其他用户读执行)。执行命令:

    chown -R www-data:www-data /path/to/your/slim/cache
    chmod -R 755 /path/to/your/slim/cache
    

    权限不足会导致file_put_contents写入失败,触发PHP致命错误直接终止进程。

  • 排查PHP运行限制
    打开php.ini(路径通常是/etc/php/x.x/fpm/php.ini),检查以下参数:

    • max_execution_time:如果缓存大文件,默认30秒可能不够,调至300或更高
    • memory_limit:缓存生成过程占用内存过高会导致进程崩溃,调至256M或512M
      也可以在Slim缓存代码前临时设置:
    ini_set('max_execution_time', 300);
    ini_set('memory_limit', '512M');
    
  • 确认缓存路径为绝对路径
    避免使用相对路径(比如./cache),不同请求的工作目录可能不同,导致路径不存在。改成绝对路径:

    $cacheDir = __DIR__ . '/../cache/'; // 根据你的项目结构调整
    

    路径不存在时file_put_contents会抛出致命错误,直接终止PHP进程。

  • 检查PHP-FPM进程配置
    打开php-fpm.conf或对应的池配置文件(比如/etc/php/x.x/fpm/pool.d/www.conf):

    • request_terminate_timeout:这个值要大于等于nginx的fastcgi_read_timeout(你设了3600s),避免PHP-FPM先杀死进程
    • pm.max_children:如果并发请求多,进程数不够会导致队列溢出,调至合理值(比如根据服务器CPU核数设置,核数*2)
    • pm.process_idle_timeout:不要设得太短,避免空闲进程被过早回收
  • 检查磁盘状态
    执行以下命令确认缓存所在磁盘是否满了,或者inode耗尽:

    df -h # 查看磁盘空间
    df -i # 查看inode数量
    

    磁盘满或inode不足会导致file_put_contents写入失败,终止PHP进程。

  • 开启PHP错误日志定位具体问题
    在php.ini中开启错误日志:

    error_reporting = E_ALL
    log_errors = On
    error_log = /var/log/php/fpm-error.log
    

    重启PHP-FPM后,触发错误时查看日志,能直接看到file_put_contents失败的具体原因(权限、路径、磁盘等)。

内容的提问来源于stack exchange,提问作者Lars

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:22:42