我目前编写的脚本开始从网上下载大型(1.3GB)XML文件但我遇到了一些问题。这是我的代码:
function readfile_chunked ($filename) {
$chunksize = 1*(1024*1024);
$buffer = '';
$handle = fopen($filename, 'rb');
if ($handle === false) {
return false;
}
while (!feof($handle)) {
$buffer = fread($handle, $chunksize);
//print $buffer;
$myFile = "test.xml";
$fh = fopen($myFile, 'a') or die("can't open file");
fwrite($fh, $buffer);
fclose($fh);
}
return fclose($handle);
}
第一个(和主要)问题是下载时出现以下错误:
Fatal error: Maximum execution time of 30 seconds exceeded in /Applications/MAMP/htdocs/test/test.php on line 53
据我了解,这基本上是一个超时,我已经阅读了关于更改php.ini中的超时设置但我意识到当这个应用程序运行时,我将无法编辑php.ini文件共享服务器。
这个问题让我进入下一个问题 - 我想实现某种错误检查和预防。例如,如果与服务器的连接出现故障,我希望能够在恢复连接时恢复。我意识到这可能是不可能的。另一种方法是比较本地和远程的文件大小吗?
我还需要在我的请求中添加一个Accept-Encoding:gzip HTTP标头。
这最终会带给我一些我想要的进度通知,大概是不时用JavaScript来比较本地和远程文件大小?
然而,前两点是最重要的,因为目前我无法下载我需要的文件。任何帮助将不胜感激。
答案 0 :(得分:1)
关于超时的问题。我建议把这个任务作为一个cron工作。从命令行运行PHP时,最大执行时间的默认设置为0(无时间限制)。通过这种方式,您可以避免猜测下载文件需要多长时间,这个变量取决于各种因素。我相信大多数共享主机允许您运行cron作业。
对于下载恢复和gzip,我建议使用PEAR包HTTP_Download
它支持HTTP压缩,缓存和部分下载,恢复和发送原始数据
答案 1 :(得分:0)
我遇到了类似php的问题,并插入以下代码来解决执行时间问题:
ignore_user_abort(真); 参数或者set_time_limit(0); ini_set('memory_limit','2048M');