一、核心参数速查表

参数名 作用范围 默认值 优先级规则 修改方式
max_execution_time PHP 脚本 30秒 代码中set_time_limit()可覆盖 php.iniset_time_limit()
memory_limit PHP 脚本 128M 代码中ini_set()优先级更高 php.iniini_set()
request_terminate_timeout PHP-FPM 0(无限制) 必须 ≥ PHP脚本设置的时间 PHP-FPM 配置文件
proxy_read_timeout Nginx 60秒 必须 ≥ PHP-FPM的超时 Nginx 配置文件

优先级口诀
Nginx > PHP-FPM > PHP代码设置 > php.ini默认值


二、参数详解与示例

1. max_execution_timeset_time_limit()

  • 作用:控制脚本最大执行时间(秒)。
  • 关联性:若同时存在,代码中的set_time_limit()会覆盖php.ini中的设置。
  • 示例:允许脚本运行 5 分钟
    <?php
    // 方法1:代码中动态设置(推荐)
    set_time_limit(300); // 300秒=5分钟
    
    // 方法2:直接修改 php.ini
    // max_execution_time = 300
    

2. memory_limit 内存限制

  • 作用:限制脚本最大内存使用(如128M, 2G)。
  • 优先级:代码中的ini_set('memory_limit', '256M')会覆盖php.ini
  • 示例:处理大文件时提升内存
    <?php
    ini_set('memory_limit', '512M'); // 临时提升到512MB
    $data = file_get_contents('huge_file.csv'); // 加载大文件
    

3. request_terminate_timeout(PHP-FPM)

  • 作用:强制终止超时的 PHP 请求(覆盖 PHP 脚本设置)。
  • 配置位置:PHP-FPM 池配置文件(如/etc/php/8.2/fpm/pool.d/www.conf)。
  • 示例:允许 PHP-FPM 处理 10 分钟请求
    ; www.conf
    request_terminate_timeout = 600s ; 必须 ≥ PHP脚本设置的时间
    

4. proxy_read_timeout(Nginx)

  • 作用:Nginx 等待 PHP 返回结果的最大时间。
  • 配置位置:Nginx 站点配置文件(如/etc/nginx/sites-available/default)。
  • 示例:避免 Nginx 提前断开 PHP 长任务
    location ~ \.php$ {
        proxy_read_timeout 600s;  # 600秒=10分钟
        fastcgi_read_timeout 600s;
    }
    

三、参数关联与配置原则

1. 时间参数层级关系

用户浏览器 → Nginx超时 → PHP-FPM超时 → PHP脚本时间
  • 规则:每层时间必须 ≥ 下一层,否则外层会提前终止请求。
  • 错误案例
    PHP脚本设置set_time_limit(300)(5分钟),但 PHP-FPM 配置request_terminate_timeout=200s,实际脚本最多运行 200秒

2. 内存参数规则

  • 代码优先ini_set('memory_limit', '256M') 优先级高于 php.inimemory_limit
  • 无限制风险:设置为-1(无限制)时,需绝对信任代码,否则易导致服务器崩溃。

四、常见问题解答

1. 如何让脚本无限制执行?(慎用!)

<?php
// 代码中解除限制
set_time_limit(0);         // 时间无限制
ini_set('memory_limit', '-1'); // 内存无限制

// 必须同步修改外部配置
// PHP-FPM: request_terminate_timeout=0
// Nginx: proxy_read_timeout=0

安全提示:生产环境建议设置合理阈值,仅在测试环境使用无限制。

2. 为什么修改了 set_time_limit() 仍报超时?

  • 原因:外层 PHP-FPM 或 Nginx 配置了更短的时间。
  • 解决
    1. 检查 PHP-FPM 的 request_terminate_timeout
    2. 检查 Nginx 的 proxy_read_timeout
    3. 确保外层时间 ≥ PHP 脚本设置的时间。

3. 内存溢出(Allowed memory size)如何快速定位?

  • 步骤
    1. 在代码中插入内存检查点:

      echo "当前内存: " . memory_get_usage()/1024/1024 . "MB\n";
      
    2. 排查循环或递归中是否累计数据未释放。

    3. 使用生成器替代大数组:

      function readLargeFile() {
          $file = fopen('huge.csv', 'r');
          while (!feof($file)) {
              yield fgets($file); // 逐行读取,内存占用极低
          }
      }
      

4. CLI 模式与 Web 模式的差异

  • 执行时间:CLI 模式默认无限制(max_execution_time=0)。

  • 内存限制:CLI 可通过命令行参数动态设置:

    php -d memory_limit=2G script.php
    

5. 如何永久修改配置?

  • 全局生效:修改 php.ini(路径可通过 php --ini 查找)。

  • 立即生效:重启 PHP-FPM 和 Nginx:

    sudo systemctl restart php-fpm.service nginx.service
    
艾林博客 - 技术分享、开发经验与AI探索的个人技术博客
艾林博客 - 技术分享、开发经验与AI探索的个人技术博客

延伸阅读:

现代接口安全实战:<span class="text-primary">从加密到防滥用的全栈策略</span> 技术随笔
现代接口安全实战:从加密到防滥用的全栈策略

很多人以为接口加了个 API-Key 或 JWT 就算“安全”。其实现代 API 安全从来不靠某一种“工具”,而是靠传输加密、认证设计、权限隔离、限速防刷、异常监控、日志审计等多个防线共同构成闭环。这一篇文章将为你系统梳理接口安全的全栈策略,避免你在业务关键点裸奔不自知。

资源 Web 安全 优化 Http 后端

Valencio

/

2025-07-04

为什么平台都不管你 key 泄露? 技术随笔
为什么平台都不管你 key 泄露?

很多开发者疑惑:如果我的 API-Key 被盗了,为什么平台方(比如腾讯云、OpenAI)都不报警、不封禁?他们难道不负责吗?本篇文章将深入解析开放平台认证背后的“边界责任模型”,帮助你厘清平台方与调用方之间的安全分工与责任归属,避免你为他人的低级错误背锅。

优化 安全 Web 后端

Valencio

/

2025-07-04