2011-03-27 97 views
3

我使用cURL从远程服务器下载大型XML文件(500MB到1GB之间)。虽然脚本对于较小的测试文件工作正常,但每次我尝试下载大于几百兆字节的文件时,脚本似乎都会挂起 - 它不会退出,没有错误消息,只会挂在那里。下载大文件时卷曲会挂起(500MB +)

我从命令行(CLI)执行脚本,所以PHP本身不应该超时。我也尝试了cURL的详细模式,但是除了初始连接之外,它没有显示任何内容。每次我下载文件时,它都会停止在正好是相同的大小(463.3MB)。该文件的XML在这一点上是不完整的。

任何想法非常赞赏。

 $ch = curl_init(); 
    $fh = fopen($filename, 'w'); 

    curl_setopt($ch,CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); 
    curl_setopt($ch, CURLOPT_FILE, $fh); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 0); 

    if(curl_exec($ch) === false) 
    { 
     echo 'Curl error: ' . curl_error($ch) . "\n"; 
    } 
    else 
    { 
     echo 'Operation completed without any errors'; 
    } 

    $response = array(
     'header' => curl_getinfo($ch) 
    ); 

    curl_close($ch); 
    fclose($fh); 

    if($response['header']['http_code'] == 200) { 
     echo "File downloaded and saved as " . $filename . "\n"; 
    } 

同样,这个脚本工作正常较小的文件,但与大文件我尝试下载它甚至没有得到尽可能打印出一条错误消息。

这可能是别的东西(Linode上的Ubuntu 10.04)终止脚本?据我了解,我的网络服务器在这里应该不重要,因为我通过CLI运行它。

感谢,

马特

+0

尝试将此选项设置为false:CURLOPT_NOPROGRESS它启用进度栏,以便您可以查看是否仍在实际下载文件。 – psion 2012-01-13 08:32:29

回答

0

检查这个post,也许你可以尝试下载文件的部分。或者,如果您有权访问远程服务器,则可尝试归档文件,然后下载它。你也可以检查你的php.ini配置。请参阅文件大小,内存限制和其他信息。

+0

感谢但范围选项不适用于我从下载的服务器(我无法控制)。在PHP.ini中也看不到任何不祥之处 - 有什么具体的建议? – Mateo 2011-03-28 00:06:17

+0

为什么不使用直接从终端curl,而不是从PHP脚本? – Faraona 2011-03-28 00:14:14

1

这些文件在停止下载时似乎完成了吗?将-m 10800添加到命令将超时并在指定的秒数后结束传输。如果您将超时设置为比传输所需的时间长,但这仍然有效,但仍然很烦人。

0

您可能正在保存的分区上的磁盘空间不足,或者运行在运行该脚本的用户的配额之上。