我有一个基本上可以清理的脚本。
脚本的一部分需要使用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
}
}
答案 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-Alive
,file_get_contents
不。
答案 1 :(得分:0)
如果您真的想这样做,可以使用php micrtotime或time函数来确定如果您需要在25秒后终止脚本,脚本会运行多长时间。 这是他们的文档条目: http://php.net/time和 http://php.net/microtime