0

現在、Web から大きな (1.3 GB) 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 点が最も重要です。どんな助けでも大歓迎です。

4

2 に答える 2

1

タイムアウトに関するご質問について。そのタスクを cron ジョブとして実行することをお勧めします。コマンドラインから PHP を実行する場合、最大実行時間のデフォルト設定は 0 (時間制限なし) です。このようにして、さまざまな要因に応じて変化するファイルのダウンロードにかかる時間の推測作業を回避できます. 共有ホストの大部分では、cron ジョブを実行できると思います。

ダウンロードの再開と gzip については、PEAR パッケージHTTP_Downloadを使用することをお勧めします。

HTTP 圧縮、キャッシング、部分ダウンロード、生データの再開と送信をサポートします。

于 2013-01-12T04:25:03.187 に答える
0

私はphpで同様の問題を抱えていたので、実行時間の問題を回避するために次のコードを挿入しました。

ignore_user_abort (真); set_time_limit(0); ini_set('memory_limit', '2048M');

于 2014-02-11T09:18:36.360 に答える