500内部服务器错误PHP长时间运行的过程

我试图运行一个很长的PHP过程,并以500内部服务器错误结束。 它执行罚款约8分钟。 更改php设置后,我重新启动了机器。

PHPconfiguration:

max_execution_time:3600

大约10分钟后ps ax | grep php:

19007? S 0:08 / usr / bin / php /home/gypsy/public_html/index.php

我已经将ignore_user_abort设置为true。

该过程卡在00:08(第8分钟),不会进一步执行。

Apache错误日志显示错误:

在返回标题之前脚本超时:index.php

似乎不知何故max_execution_time不起作用。 任何build议将是一个很大的帮助。

更新:

我已经能够检测到这个问题。 防火墙阻止了这个过程。 服务器使用iptables和configserver作为防火墙。 禁用防火墙工作正常。 但是我不确定要更改哪些设置以允许防火墙中的长时间运行的进程

每当我看到“标题” – 错误,我检查是否

  1. 有任何输出缓冲活动
  2. 已经有任何标题生成

在任何可能的失败和/或在代码转发的地方可能发生之前。 最后的手段有时是这样的脚本阶段:

var_dump($runtimeStuffInfo);die('argh!'); 

并缩小出现问题的地区代码。 你不是在说什么你的“8分钟脚本”试图做什么,但从我的经验来看,最稳定的方法是坚持使用CLI来处理这种事情:

理想情况下,您可以通过SSHlogin到您的服务器,并从命令行运行脚本(最好通过nohup,所以你不必关心连接是否中断) – 这样你总是可以看到你的脚本停止(如果它仍然会这样做的话),因为你可以直接logging每一个比特,因为它被回显到控制台。

如果你不拥有通过SSHlogin的权限,你仍然可以尝试exec ('nohup php long_running_job.php > /some/writable/directory/with766/your_job.log')来触发你的工作在一个PHP页面(例如http://example.com/startjob.php ),然后在另一个脚本页面(例如http://example.com/jobresults.php )从your_job.logparsingcronjob的输出。

如果上面所有的东西都不能让你到达那里,我会把工作分解成一小段工作,在超时问题发生之前就可以完成,然后一个接一个地打电话给他们。

怎么样set_time_limit(3600);

在你的脚本的开始? 这会工作吗?

是FCGI的Apache处理程序? 如果是这样,则必须将FcgidIOTimeout和FcgidBusyTimeout设置为更高的值。 在加载fcgi模块之后,可以将这些指令放置在apacheconfiguration文件中(或者在某些情况下,在fcgi.conf或php.conf中)。 你可以在apache的fcgi文档中find更多的信息http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html