本文目录导读:

在 PHP 项目中配置站点超时时间,通常需要从 PHP 层面 和 Web 服务器层面 两方面入手,具体配置方法取决于你的应用场景(单次脚本执行时间过长、文件上传、或是长时间连接)。
以下是几种常见的配置方法:
PHP 脚本执行超时(最常见)
这是针对单个 PHP 脚本(处理大数据、生成报表)允许运行的最大时间。
方法 A:修改 php.ini 文件(全局生效)
找到 php.ini 文件中的以下配置项进行修改,然后重启 Web 服务器。
; 每个脚本允许的最大执行时间,单位是秒。 ; 设置为 0 表示无限制(不推荐生产环境使用)。 max_execution_time = 300 ; 解析请求数据(POST 数据)的最大时间。 max_input_time = 300 ; 单个脚本允许消耗的最大内存。 memory_limit = 256M
方法 B:在 PHP 代码中动态设置(推荐)
在需要长时间运行的脚本顶部加上以下代码,只对该文件生效:
// 设置为 5 分钟
ini_set('max_execution_time', 300);
// 或者设置为无限制(慎用)
set_time_limit(0);
注意: set_time_limit() 函数不会影响 browscap 或 exec() 调用的系统命令,函数运行时间仅计算脚本本身的执行时间。
Web 服务器超时(Nginx / Apache)
即使 PHP 本身没有超时,Web 服务器(Nginx/Apache)也可能在到达其超时时间后断开连接,导致脚本被中断。
针对 Nginx(FastCGI 方式)
编辑 Nginx 配置(通常位于 server 或 location ~ \.php$ 块中):
server {
# ... 其他配置
location ~ \.php$ {
# 设置 FastCGI 代理的超时时间
fastcgi_connect_timeout 60; # 连接超时
fastcgi_send_timeout 60; # 发送请求体超时(上传大数据时重要)
fastcgi_read_timeout 300; # 读取响应超时(脚本执行时间长时需调大)
# 如果需要处理大文件上传,还要加上:
client_max_body_size 100M; # 允许上传文件大小
proxy_buffering off; # 防止缓冲导致超时
# ... 其他 fastcgi 配置
}
}
修改后需要重载 Nginx:
nginx -s reload
针对 Apache(mod_php 或 CGI)
如果使用 mod_php,通常不需额外配置(PHP 自身处理),如果使用 CGI/FastCGI,可以修改 httpd.conf 或 .htaccess 文件:
# 设置请求处理时间
TimeOut 300
# 如果是代理请求
ProxyTimeout 300
# 针对 CGI/FastCGI 请求
<IfModule mod_fcgid.c>
FcgidIOTimeout 300
FcgidBusyTimeout 300
</IfModule>
文件上传超时(特殊场景)
上传大文件时,除了上述配置外,还需要确保上传处理时间足够。
在 PHP 中结合使用:
# 在 php.ini 或代码中 ini_set
ini_set('max_execution_time', 3600); # 给 1 小时
ini_set('upload_max_filesize', '100M');
ini_set('post_max_size', '110M');
ini_set('max_input_time', 600);
在 Nginx 中还必须增加 fastcgi_send_timeout。
MySQL / 数据库连接超时
如果脚本超时是因为数据库连接断开(“MySQL server has gone away”),需要调整数据库的交互超时:
在 PHP 连接之前设置:
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_TIMEOUT => 30, // 连接等待超时秒数
]);
或者执行 SQL 查询延长连接生命周期:
SET SESSION wait_timeout = 28800; -- 8小时 SET SESSION interactive_timeout = 28800;
推荐优先级及最佳实践
- 不推荐全局设置
max_execution_time = 0(无限制),容易导致进程被卡死或数据库连接泄露。 - 推荐在特定长耗时的脚本
if判断中临时开启:// 仅在执行长时间后台任务时启用 if (isset($_GET['task']) && $_GET['task'] === 'bulk_export') { set_time_limit(600); // 10分钟 // 执行导出逻辑…… } - 建议在 PHP 代码中记录执行日志,并在
register_shutdown_function中捕获超时错误。
最常见的配置组合
- PHP 脚本执行时间 →
ini_set('max_execution_time', 300); - Nginx 读取超时 →
fastcgi_read_timeout 300; - 文件上传大小 →
client_max_body_size&post_max_size&upload_max_filesize
配置完成后,可以写一个简单的测试脚本 time_test.php:
<?php
ini_set('max_execution_time', 10); // 故意设小测试
for ($i = 0; $i < 100; $i++) {
echo "Counter: $i\n";
sleep(2);
}
10 秒后页面返回错误或白屏,说明超时设置已生效。