在循环中使用CURL下载文件,第一个工作,第二个工作,第二个工作

问题描述:

早上所有,在循环中使用CURL下载文件,第一个工作,第二个工作,第二个工作

我正在使用CURL来下载循环中的图像文件。第一次运行良好,我看到图像出现在目录中。

第二次失败并发生超时,尽管它是有效的URL。

任何人都可以提出为什么它总是在第二次失败,以及如何解决它?

的代码片段是:

// download image 

$extension = "gif"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_TIMEOUT, 90); 
curl_setopt($ch, CURLOPT_URL, $imgurl); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
echo $imgurl . " attempting to open URL "; 
$i = curl_exec($ch); 
if ($i==false) { 
    echo curl_errno($ch).' '.curl_error($ch); 
} 
$image_name=time().'.'.$extension; 
$f = fopen('/fulldirectorypath/' . $image_name ,'w+'); 
fwrite($f,$i); 
fclose($f); 

我已经把回声在那里显示$ imgUrl的,检查它是否有效,并调升超时90秒,但它仍然失败。这是我在屏幕上看到:

http://images.eu-xmedia.de/thumbnails/34555861/5676051/pt=pic,lang=2,origfile=yes/image.gif 试图打开URL 28操作 超时后90秒0 字节收到

一个空文件在我的目录中创建。

非常感谢,

格雷格

如果你一遍又一遍地打同一个网站,他们可能有一些东西,超时请求太快到来。如果您正在循环,请在每次迭代后尝试添加简短的sleep

你应该着眼于使用的一件事是多卷曲。它并行运行Curl操作。 Curl Functions on php.net部分记录它们。我建议看看this tutorial。有人可能写了一个面向对象的卷曲和多卷曲的抽象。

+0

我试过60秒睡眠,但我仍然有同样的问题... – kitenski 2010-06-07 11:22:12

尝试在fclose($f);后面添加curl_close($ch);。我似乎很可能试图重复使用连接,这反过来导致了这个问题。

+0

谢谢约瑟夫,我刚刚尝试过,但仍然看到相同的问题。 – kitenski 2010-06-07 14:27:10

+0

如果您运行单个实例(而不是循环),然后在完成后立即刷新浏览器,它会工作吗? – Joseph 2010-06-07 14:41:18

+0

有趣...我创建了一个小测试文件,它有一个不同的IMG链接它的工作,与上面确定的一个我得到同样的问题.... – kitenski 2010-06-07 14:55:44