直接修改 php.ini 中的 max_execution_time 并重启 apache 是最稳妥方式,需确认 phpinfo 中 local value 与 master value 一致,且注意 web 服务器和 php-fpm 的额外超时限制。

直接改 php.ini 里的 max_execution_time 是最稳妥的方式,但改完不重启 Apache 就等于没改——这是 90% 人踩过的坑。
怎么找到并修改 XAMPP 的 php.ini 文件
Windows 下路径通常是 C:\xampp\php\php.ini;macOS 是 /Applications/XAMPP/xamppfiles/etc/php.ini。别用记事本直接双击打开,容易乱码,用 VS Code、Notepad++ 或系统自带的文本编辑器(如 macOS 的 TextEdit 切换为纯文本模式)打开更安全。
搜索 max_execution_time,你会看到类似这一行:
max_execution_time = 30
把它改成你需要的值,比如大数据导出常用 max_execution_time = 300(5 分钟),极端情况可设为 600 或 1200。注意:不要写成 300s 或带单位,只写纯数字。
改完保存,下一步不是刷新网页,而是:
- 在 XAMPP 控制面板里先点
StopApache,再点Start——“重启”按钮不一定可靠,手动停启更保险 - Linux/macOS 命令行用户可用
sudo /Applications/XAMPP/xamppfiles/xampp restartapache(macOS)或对应脚本 - 改完后访问
http://localhost/dashboard/phpinfo.php,搜索max_execution_time,确认显示的值已更新且“Local Value”和“Master Value”一致
为什么改了 php.ini 还是超时?Web 服务器和 PHP-FPM 在背后卡你
max_execution_time 只管 PHP 脚本层,但请求链路上还有两道更硬的超时:
- Nginx/Apache 自身的超时设置优先级更高:XAMPP 用的是 Apache,默认
Timeout 300(单位秒),但这个值通常没被显式写在配置里,所以实际生效的是编译默认值(常见为 300 秒)。如果你用的是 Nginx + PHP-FPM 组合(非 XAMPP 默认),还要检查fastcgi_read_timeout - PHP-FPM 模式下,
request_terminate_timeout在php-fpm.conf中,它会直接 kill worker,完全无视max_execution_time。XAMPP 默认不用 PHP-FPM,所以这条对多数人不生效,但如果你手动切换过 SAPI 模式就得留心 - phpMyAdmin 导入大 SQL 文件时,即使 PHP 允许跑 1200 秒,Apache 仍可能因响应头未及时返回而断连——这时看错误日志会发现是
504 Gateway Timeout,而非 PHP 的Maximum execution time exceeded
临时改法:ini_set() 和 set_time_limit() 各有适用场景
这两者都不需要改配置文件,适合开发调试或权限受限环境,但行为差异很大:
-
ini_set('max_execution_time', '300'):只对当前请求生效,放在脚本最开头;但如果php_admin_flag[disable_functions]禁用了ini_set(某些共享主机会这么干),这行就静默失效 -
set_time_limit(300):从调用点起重新计时 300 秒,不是累加;比如脚本已运行 280 秒后调用它,还能再跑 300 秒;多次调用以最后一次为准;set_time_limit(0)表示不限时,但在 Apache 模块模式下可能被忽略,不推荐 Web 场景使用 - 两者都无法绕过 Web 服务器层超时,所以仅用于“补救”,不能替代
php.ini修改
max_execution_time = 0 真的能用吗
能设,但 Web 请求中基本不该用:
- 设为 0 后,一个阻塞的
file_get_contents()或没设 timeout 的 cURL 请求,会让整个 Apache worker 卡死,后续请求排队等待,并发能力瞬间归零 - CLI 模式下
max_execution_time = 0是默认行为,所以命令行脚本不受限;但 web 请求永远走的是 mod_php 或 CGI 模式,逻辑不同 - 云平台(如阿里云函数计算、腾讯云 SCF)会硬性截断执行,比如最多允许 300 秒,你设成 0 也没用,反而触发平台级强制终止,日志里只显示“Execution timeout”,找不到 PHP 层报错
真正耗时的任务,应该拆成队列+分片处理,而不是靠拉长超时来掩盖设计缺陷——max_execution_time 是安全阀,不是加速器。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











