0

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

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

4

2 回答 2

1

关于你关于超时的问题。我建议将该任务作为 cron 作业运行。从命令行运行 PHP 时,最大执行时间的默认设置为 0(无时间限制)。通过这种方式,您将避免猜测下载文件需要多长时间,这取决于各种因素。我相信大多数共享主机都允许您运行 cron 作业。

对于下载恢复和 gzip,我建议使用 PEAR 包HTTP_Download

它支持 HTTP 压缩、缓存和部分下载、恢复和发送原始数据

于 2013-01-12T04:25:03.187 回答
0

我在 php 中遇到了类似的问题,并插入了以下代码来解决执行时间问题:

忽略用户中止(真);设置时间限制(0);ini_set('memory_limit', '2048M');

于 2014-02-11T09:18:36.360 回答