2

在调整一堆图像(大约 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()... 的行)

这怎么可能?

4

2 回答 2

2

系统调用不计入 PHP 运行时间等几乎没有max_execution_time影响set_time_limit。如果您从网络服务器调用脚本,您必须知道网络服务器(不是 PHP)可能会断开 HTTP 连接。

例如:

阿帕奇默认配置:

# 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 <> Client 协商而不是 Webserver <> PHP,webserver(和客户端!)仍然可能会在一段时间后简单地断开连接。

耗时超过几分钟的脚本应始终从控制台运行。HTTP 服务器不会让单个请求保持数小时的活动状态。

从控制台(linux)使用 PHP 脚本:

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

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

附录:

set_time_limit() 函数和配置指令 max_execution_time 只影响脚本本身的执行时间。在确定脚本运行的最长时间时,不包括在脚本执行之外发生的任何活动所花费的时间,例如使用 system() 的系统调用、流操作、数据库查询等。在测量时间是真实的 Windows 上,情况并非如此。

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

于 2013-09-12T14:42:36.760 回答
1

使用设定的时间限制

set_time_limit(0);
于 2013-09-12T14:29:29.380 回答