一、核心参数速查表
参数名 | 作用范围 | 默认值 | 优先级规则 | 修改方式 |
---|---|---|---|---|
max_execution_time |
PHP 脚本 | 30秒 | 代码中set_time_limit() 可覆盖 |
php.ini 或 set_time_limit() |
memory_limit |
PHP 脚本 | 128M | 代码中ini_set() 优先级更高 |
php.ini 或 ini_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_time
与 set_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.ini
的memory_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 配置了更短的时间。
- 解决:
- 检查 PHP-FPM 的
request_terminate_timeout
- 检查 Nginx 的
proxy_read_timeout
- 确保外层时间 ≥ PHP 脚本设置的时间。
- 检查 PHP-FPM 的
3. 内存溢出(Allowed memory size)如何快速定位?
- 步骤:
-
在代码中插入内存检查点:
echo "当前内存: " . memory_get_usage()/1024/1024 . "MB\n";
-
排查循环或递归中是否累计数据未释放。
-
使用生成器替代大数组:
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
喜欢就支持一下吧!
版权声明:除却声明转载或特殊注明,否则均为艾林博客原创文章,分享是一种美德,转载请保留原链接,感谢您的支持和理解