Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP最大执行时间未超时_Php_Apache - Fatal编程技术网

PHP最大执行时间未超时

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

这不是一个常见的问题,如果睡眠被计算为超时或诸如此类的事情。好的,问题是:我已经将PHP的最大执行时间设置为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;
结束时间($\u gEndTime)的计算方法与此类似。
总时间是在我注册的关机函数中计算的:

register_shutdown_function('shutdown');
.............
function shutdown()
{
   ..............
   ..............
   $_total_time = $_gEndTime - $_gStartTime;
   ..............
   switch (connection_status ())
    {
    case CONNECTION_NORMAL:
      ....
      break;
      ....
    case CONNECTION_TIMEOUT:
      ....
      break;
      ......
    }
} 
注意:我不能使用$\u SERVER['REQUEST\u TIME'],因为我的PHP版本不兼容。那太糟糕了-我知道

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


我在这一点上被难住了。PHP向导-请帮助

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

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

如果您需要在一定时间后超时(根据注释),为什么不调用

 $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();
}

你得到了jist。不太漂亮,但可能有用。

我相信文件系统操作也不计入时间限制计算。你知道,你可以使用
microtime(true)
立即获得
float
返回…@lonesomeday:你确定吗?@Joey Ezekiel是的。查看文档中的
设置时间限制
。“流操作”是显式的included@deceze是的,我知道。但这是遗留代码,我现在并不是真的想看看代码的质量。无论如何,谢谢你。真的。。即使等待DB查询或处理数据流也被排除在等式之外,但我没有任何系统exec调用,也没有调用任何外部代码。文件系统操作是否在最大执行时间限制内计算?比如说,一个fopen()@joyezekiel即使你不做任何没有考虑到
max\u execution\u time
的操作,操作系统上下文切换仍然在进行,你几乎什么也做不了。好的,你可以
renice
运行php的进程(本例中为apache),但我不推荐它。@Joey Ezekiel是的,请阅读php手册页面上的说明:流操作也会影响时间限制(而fopen/fread/etc是流操作)@Joey Ezekiel你不能将这些操作包括在
max_execution_time
中。为了克服这一点,你可以注册一个回调来检查经过了多少时间,但这是非常低效的(因为回调会被调用很多次,并且会浪费很多cpu周期),我强烈建议不要这样做。当我知道延迟一定会发生在哪里时,这可能会起作用。但就我而言,延迟是随机的。例如:如果第一次检查通过,microtime()-$startscript是小于1500的任何值,并且如果延迟正好发生在调用第二次检查之前,情况又是一样的。无论如何谢谢你。。。!