使用PHP下载一个非常大的XML文件

时间:2013-01-12 02:54:45

标签: php

我目前编写的脚本开始从网上下载大型(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来比较本地和远程文件大小?

然而,前两点是最重要的,因为目前我无法下载我需要的文件。任何帮助将不胜感激。

2 个答案:

答案 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');