繁体   English   中英

通过计数避免最长执行时间-PHP

[英]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.phpCURLOPT_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不使用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM