Apache的Timeout指令在phpEnv中位于C:\phpenv\apache\conf\extra\httpd-default.conf,需同步配置ProxyTimeout;PHP脚本超时由PHP-FPM的request_terminate_timeout控制,而非max_execution_time,二者均需修改并分别重启Apache和PHP-FPM服务。

phpEnv 是 Windows 下的集成环境套件,底层用的是 Apache + PHP-FPM(或 mod_php)组合。它不提供图形化超时配置界面,所有超时相关修改都得手动改配置文件——而且必须分清「Apache 网络层超时」和「PHP 脚本执行超时」,两者完全独立,改错地方就白忙。
Apache 的 Timeout 指令在哪改
phpEnv 自带的 Apache 配置主文件路径通常是:C:\phpenv\apache\conf\httpd.conf 或 C:\phpenv\apache\conf\extra\httpd-default.conf。别在虚拟主机配置里找 Timeout,它默认藏在 httpd-default.conf 里。
- 打开该文件,搜索
Timeout,你会看到类似Timeout 300 - 把它改成你需要的秒数,比如长任务接口要跑 30 分钟:
Timeout 1800 - 如果用了
mod_proxy_fcgi(phpEnv 默认就是),还必须加ProxyTimeout,否则 Apache 代理到 PHP-FPM 时仍会沿用默认 300 秒:ProxyTimeout 1800 - 改完保存,必须重启 Apache:在 phpEnv 控制面板点「Restart Apache」,或命令行执行
httpd -k restart
PHP 脚本不超时的关键不是 Apache,而是 PHP-FPM 配置
phpEnv 默认启用 PHP-FPM,所以光改 Apache 的 Timeout 没用——PHP 脚本会在到达 FPM 层限制时被直接杀掉,日志里出现 child xxx exited on signal 15 就是这个原因。
- 找到 FPM 池配置文件:
C:\phpenv\php\php-fpm.d\www.conf - 确认并修改这两项:
request_terminate_timeout = 1800s(硬性终止,必须设)、request_slowlog_timeout = 60s(可选,用于诊断) - 注意:
max_execution_time在php.ini里设成 1800 只是“软限制”,FPM 层不认它;request_terminate_timeout才是真正起效的 - 改完必须重启 PHP-FPM 服务:在 phpEnv 控制面板点「Restart PHP」,或命令行执行
php-fpm -t && net stop php-fpm && net start php-fpm
长连接保活还要关缓冲、设心跳、防代理截断
即使超时调大了,中间网络设备(如路由器、防火墙)或浏览器自身仍可能因空闲断开连接。PHP 脚本里不做处理,照样 60 秒后断。
- 脚本开头必须禁用输出缓冲:
while (ob_get_level()) ob_end_clean();,再加ob_implicit_flush(true) - 每轮输出后手动刷出:
echo "data: ping\n\n"; flush();(SSE 格式)或echo "\n"; flush();(简单心跳) - 禁用 zlib 压缩:
ini_set('zlib.output_compression', 'Off');,否则flush()无效 - Apache 默认启用了
KeepAlive On,但KeepAliveTimeout只有 5 秒,建议同步调高:KeepAliveTimeout 30(写在httpd-default.conf)
最容易被忽略的是:phpEnv 的 Apache 和 PHP-FPM 是两个独立进程,各自超时配置互不影响;且 Windows 下服务重启有时不彻底,建议改完配置后手动在任务管理器里确认 httpd.exe 和 php-fpm.exe 进程是否已更新。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











