[英]Avoid maximum execution time with a count - PHP
我有一个脚本,基本上是在清理东西。
脚本的一部分需要使用file_get_contents
检查图像是否存在
我知道这会遇到问题,并且会出现Fatal error: Maximum execution time of 30 seconds exceeded
并希望避免这种情况。
有没有一种方法可以设置一个开始计数的计数器,如果在说25秒后file_get_contents失败,脚本将忽略然后继续。
我会说,我知道可以,但我不想增加时限。
这是基本脚本:
$query = "select table_id, image_url from table";
$res = $mysqli->query($query) or trigger_error($mysqli->error."[$query]");
while($row = $res->fetch_array()){
// save the image
$img = '/path/to/'.$row[table_id].'.jpg';
//## need to start counting to 25 secs here
$saveImage = file_put_contents($img, file_get_contents($row[image_ur]));
//## check if 25 seconds realised, if so with no $saveImage then continue
if($saveImage){
// do something else
}
}
除了获取整个文件外,您还可以使用CURL对它进行“ ping”操作,因此仅获取其标头并获取状态代码(200 =文件存在,404 =文件不存在)。
如果文件不是远程文件,请使用file_exists()
。 如果file_exists中包含PHP包装器,这也将很有趣,因此您可以执行以下操作:
file_exists('http://image.url.com/file.jpg');
我不确定这是否可行或是否仅检查状态码,但值得尝试。
否则,请使用带有不下载正文的选项的CURL:
curl_setopt($curl, CURLOPT_NOBODY, true);
在CLI中运行此脚本而不是通过浏览器运行该脚本,然后将超时设置为2小时并使其运行,这也很好。
如果您无法更改超时,请查看Gearman,然后在使用浏览器点击脚本后简单地分派工作。
更新
您不必“计数到25”,可以使用以下选项设置此超时:
CURL: http://php.net/manual/en/function.curl-setopt.php
: CURLOPT_CONNECTTIMEOUT
string file_get_contents ( string $filename
[, bool $use_include_path = false
[, resource $context [, int $offset = -1 [, int $maxlen ]]]] )
使用$context
:
resource stream_context_create ([ array $options [, array $params ]] )
与stream_set_timeout
结合使用:
bool stream_set_timeout ( resource $stream , int $seconds [, int $microseconds = 0 ] )
我强烈建议将CURL与NOBODY和TIMEOUT选项一起使用,以便您的脚本运行速度提高10倍,并设置了超时时间(25太多了,使用5或更低的值)。
CURL还使用Keep-Alive
, file_get_contents
不使用。
如果您确实想这样做,则可以使用php micrtotime或time函数来确定该脚本运行了多长时间(如果需要在25秒后终止该脚本)。 这是它们的文档条目: http : //php.net/time和http://php.net/microtime
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.