PHP max_execution_time没有超时

时间:2012-06-29 09:10:56

标签: php apache

如果睡眠计算超时或类似的东西,这不是常规问题之一。好的,这就是问题所在:我已经将PHP的max_execution_time设置为15秒,理想情况下,当它超过设定限制时应该超时,但事实并非如此。在更改为php.ini文件后,Apache已重新启动,并且ini_get('max_execution_time')一切正常。有时脚本运行最多200秒,这很疯狂。我没有任何数据库通信。所有脚本都在查找unix文件系统上的文件,并在某些情况下重定向到另一个JSP页面。脚本上没有sleep()。

我像这样计算PHP脚本的总执行时间:

在脚本开头我设置:

$_mtime = microtime();  
$_mtime = explode(" ",$_mtime);
$_mtime = $_mtime[1] + $_mtime[0]; 
$_gStartTime = $_mtime;

和结束时间($ _ gEndTime)的计算方式相似 总时间是在我注册的关机功能中计算的:

register_shutdown_function('shutdown');
.............
function shutdown()
{
   ..............
   ..............
   $_total_time = $_gEndTime - $_gStartTime;
   ..............
   switch (connection_status ())
    {
    case CONNECTION_NORMAL:
      ....
      break;
      ....
    case CONNECTION_TIMEOUT:
      ....
      break;
      ......
    }
} 

注意:我不能使用$ _SERVER ['REQUEST_TIME'],因为我的PHP版本不兼容。那很糟糕 - 我知道。

1)嗯,我的第一个问题显然是为什么我的PHP脚本即使在设置超时限制后也会执行?
2)Apache具有300秒的Timeout指令,但PHP二进制文件不读取Apache配置,这应该不是问题。
3)是否有可能将PHP发送到睡眠模式? 4)我是否以错误的方式计算执行时间?有更好的方法吗?

我在这一点上很难过。 PHP向导 - 请帮忙。

编辑: 我刚刚发现流操作不是几个日志的原因。即使没有执行流操作,延迟在脚本中也是随机的。上下文切换可能就是原因。但我仍然没有明确的答案。我查了Real max_execution_time for PHP on linux,但我不确定我是否想尝试一下。还有其他建议吗?

2 个答案:

答案 0 :(得分:7)

max_execution_time仅限制脚本执行时间本身 - 脚本的 cpu time 。如果操作系统上下文切换到另一个进程并在那里花了一些时间,那么它也不会被计算在内。因此,测量现实世界时间并在30秒后期待超时在任何给定时间都不会成立。当然,它也忽略了任何systemexec或网络时间

答案 1 :(得分:0)

如果您需要在一段时间后(根据评论)超时,为什么不打电话

 $startscript = microtime();

 //do some stuff

if (microtime() - $startscript > 1500)
{
  dotimeout();
}


  // do more stuff

if (microtime() - $startscript > 1500)
{
  dotimeout();
}

  // do more stuff

if (microtime() - $startscript > 1500)
{
  dotimeout();
}

你得到了这个小说。不是很漂亮,但可能有效。