5

如果睡眠被计算为超时或类似的东西,这不是常见的问题之一。好的,问题来了:我已将 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 向导 - 请帮助。

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

4

2 回答 2

7

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

于 2012-06-29T09:16:59.333 回答
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();
}

你明白了。不是很漂亮,但可能有用。

于 2012-06-29T13:44:15.110 回答