php exec() - max_execution_time和致命错误

时间:2013-09-12 14:26:37

标签: php fatal-error

在调整大量图像(约9000)时,我使用此功能:

function im_call($_data, &$_im_output, $_debug = IM_DEBUG) {

  ini_set('max_execution_time', '3600');
  exec($_data, $_im_output, $_im_error); // this is line 93
  return $_im_error;

} // end function

过了一会儿(大约30分钟),PHP就死了:

致命错误:第93行的/some/path/im_lib.php超出了30秒的最长执行时间

(这是exec()的行......)

这怎么可能?

2 个答案:

答案 0 :(得分:1)

使用set time limit

set_time_limit(0);

答案 1 :(得分:1)

系统调用不计入PHP运行时间,因此几乎不会影响max_execution_timeset_time_limit。如果从Web服务器调用脚本,则必须知道Web服务器(而不是PHP)可能会丢弃HTTP连接。

例如:

Apache默认配置:

# Timeout: The number of seconds before receives and sends time out.
#
Timeout 180

# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100

# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 15

每隔15秒,发送一个保持活动状态,在HTTP请求开始和关闭连接之间重复100次= 1515秒。这大约是25分钟,差不多半个小时。 即使这是关于Webserver<>客户端协商而非Web服务器<> PHP,网络服务器(和客户端!)仍然可能会在一段时间后暂停连接。

花费超过几分钟的脚本应始终从控制台运行。 HTTP服务器无法将单个请求保持活动数小时。

使用来自控制台(linux)的PHP脚本:

#!/usr/bin/php
<?php
/* code */

结合set_time_limit,PHP垃圾收集器和更多内存的设置,这些脚本可以运行很长时间。

附录:

  

set_time_limit()函数和配置指令   max_execution_time仅影响脚本的执行时间   本身。花在执行之外的活动上的任何时间   使用system(),流操作等系统调用的脚本   确定最大值时不包括数据库查询等   脚本运行的时间。在Windows上不是这样   测量时间是真实的。

http://php.net/manual/en/function.set-time-limit.php