在调整大量图像(约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()的行......)
这怎么可能?
答案 0 :(得分:1)
set_time_limit(0);
答案 1 :(得分:1)
系统调用不计入PHP运行时间,因此几乎不会影响max_execution_time
和set_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上不是这样 测量时间是真实的。