使用计数避免最大执行时间 - PHP

时间:2014-02-21 07:46:01

标签: php

我有一个基本上可以清理的脚本。

脚本的一部分需要使用file_get_contents

检查图像是否存在

知道这会遇到问题,我会不时得到Fatal error: Maximum execution time of 30 seconds exceeded,并希望避免这种情况。

有没有办法设置一个开始计数的计数器,如果file_get_contents在25秒之后失败,则脚本会忽略然后继续计数。

我会说,我知道我可以,但我不想增加时间限制。

这是基本脚本:

$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
    }

}

2 个答案:

答案 0 :(得分:1)

您可以使用CURL“ping”它,而不是获取整个文件,因此您只需获取其标题并获取状态代码(200 =文件存在,404 =文件不存在)。

如果文件不是远程文件,请使用file_exists()。 将files包装器包含在file_exists中也很有趣,所以你可以这样做:

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-Alivefile_get_contents不。

答案 1 :(得分:0)

如果您真的想这样做,可以使用php micrtotime或time函数来确定如果您需要在25秒后终止脚本,脚本会运行多长时间。 这是他们的文档条目: http://php.net/timehttp://php.net/microtime