导入超时需同步配置max_input_time和max_execution_time(如均设为600),并调整nginx的fastcgi_read_timeout≥600,同时在脚本中用set_time_limit()分批重置超时,且须排查mysql、curl等阻塞点。

PHP最新版(8.3/8.4)中,“导入超时”不是单一配置项,而是由 max_input_time、max_execution_time、Web服务器超时、以及实际阻塞点共同决定的。只改其中一个,基本无效。
为什么导入卡在上传阶段就报错?
因为 max_input_time 控制的是 POST 数据解析和文件上传的耗时,它先于 max_execution_time 触发。默认值通常是 60 秒,上传一个 100MB 的 Excel 或 SQL 文件,光解压 ZIP + 解析 multipart 表单就可能超时。
-
max_input_time必须 ≥ 预估上传+解析时间(建议设为 600,即 10 分钟) -
max_execution_time要同步设为 600 或更高,否则后续读取、验证、插入阶段仍会中断 - 改完后必须重启 PHP-FPM(不是重载 Nginx),否则不生效
- 宝塔用户:【软件商店】→ 对应 PHP → 【设置】→ 【配置修改】里改,然后点【重载配置】
Nginx 返回 504 Gateway Timeout 怎么办?
哪怕 PHP 允许跑 600 秒,Nginx 默认的 fastcgi_read_timeout 通常只有 60 秒,它会在 PHP 还没执行完时就把连接砍掉。
- 在宝塔【网站】→ 【设置】→ 【配置文件】里,找到
location ~ \.php$ { }区块末尾 - 添加:
fastcgi_read_timeout 600;(不能写在 http 或 server 顶层) - 保存后点【重载配置】,无需重启 Nginx 全局服务
- 注意:这个值必须 ≥ PHP 的
max_execution_time,否则形同虚设
导入脚本里怎么避免中途被截断?
set_time_limit() 比 ini_set('max_execution_time', ...) 更可靠,因为它每次调用都重置计时器,适合分批处理场景。
- 在每批数据处理前调用,例如:
set_time_limit(120);(给这批操作 2 分钟) - 它对阻塞式 I/O(如未设 timeout 的
mysqli_query()、curl_exec())无效——这些必须单独配超时 - Web 环境下传 0 并不能真正“无限”,Nginx/PHP-FPM 仍会兜底;CLI 下才真正有效
- 配合流式读取(如
fopen()+fgetcsv())或box/spout替代PhpSpreadsheet::load(),能大幅降低内存压力和实际耗时
真正卡住的地方往往不在 PHP 计时器里,而在 MySQL 插入、未设 timeout 的 cURL、或者 PhpSpreadsheet 默认开启的公式计算和样式解析上。调高超时只是让错误暴露得更晚,而不是解决问题本身。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











