我的问题是较长的 php 脚本(几个小时)过早退出。(FireFox 说“页面加载时与服务器的连接已重置”)。
它们有时会在 30 分钟后退出,有时会在 1 小时 45 分钟后退出。
- CentOS 6.6 64位
- Apache 2.2.9 MPM 工作器
- php 5.5.20 mod_fcgid 2.3.9
- 未安装操作码缓存
- cPanel 和 WHM 11.46
- 我有 root 权限
对于 FastCGI,我通过 WHM 包含编辑器将以下内容包含到 httpd.conf 中,并包含到 post_virtualhost:
<IfModule mod_fcgid.c>
FcgidBusyTimeout 86400
FcgidIOTimeout 86400
</IfModule>
在 IfModule 部分之后,我有 < Directory path/to/mysite> 部分('<' 之后没有空格)。
我在脚本中多次使用 set_time_limit() 和 ignore_user_abort() 来使其保持运行。
apache 错误日志中没有任何内容。
php信息:http://lot-art.com/info.php(您可以看到 set_time_limit() 和 ignore_user_abort() 起作用了)
它在运行 mod_php 的旧服务器上运行良好:http://216.119.148.91/info.php
答案1
只需通过 cron /等运行独立于 Web 服务器的脚本即可。
如果您需要从 Web 服务器运行它...popen(nohup ..)并在客户端上运行该脚本...
我的猜测是网络服务器/浏览器连接超时/失败,最终 TCP 堆栈说“我们在这里完成了”并且 php 进程被拆除...我不愿想象浏览器窗口要等待几个小时才能完成脚本......
如果您真的想这样做..并且问题确实是客户端连接问题,您可以考虑在脚本/php.ini 中将 ignore-user-abort 设置为 true...
答案2
这是否可能是由于 PHP 5.5 中的错误造成的?诸如分段错误之类的问题会导致 php 立即退出 - 据我所知不会记录任何错误。
我同意你应该从命令行运行它,如果它是一个段错误或类似错误,那么尝试运行它 gdb 来获取核心转储并在此处将其报告为错误: https://bugs.php.net/
如果这不是一个选项,我会尝试向任务添加日志记录以缩小脚本退出的时间点。