0

サーバーからファイルをストリーミングし、収集されたデータを一度に小さなチャンクで保存して、メモリオーバーフローをホストサーバーに保存するスクリプトがあります。

PHPスクリプトだと言いましたか?

これが仕組みです

//loop while data exists on the clients server side file.
while (!feof($xml_fp)) {

                   //grab data in proportions of specified chunk
                   //write the the collected chunk locally
                    //if there's an error, exit (improve error handling for final code)


             $result =  fwrite($local_fp, fread($xml_fp, $size), $size);

                   if($result === false){
        echo"<h1> ERROR </h1>";
        exit(); 
                            }

                   else    {
                $progress += $result;
                ob_flush(); 
                flush(); 
                ?>
               //state amount of data downloaded thus far
                <script>
                $('#progress').html(' ');
                $('#progress').append(<?php echo (float)$progress/(1024*1024) ?>);
                </script>
                <?php

             //if all goes well, increase time limit by a second
                set_time_limit(1);

                     }
}//while loop ends here

このスクリプトは、ローカルで適切に実行されます。問題がないことを確認するために、さまざまなサイズのファイルを使用してライブ サーバーで多くのテストを実行する必要がありますが、ファイルのサイズは 50 MB から 200 MB の範囲である可能性があります。

fread 関数と fwrite 関数にはかなりのオーバーヘッドがあることに注意してください。ダウンロード レートが 40 kbps を超えるとは予想していません。平均ダウンロード時間の見積もりでは、スクリプトの実行時間は約 10 分になります。

質問: 通常、サーバーはスクリプトの実行時間がこれほど長いことを検出すると、ファウルを呼び出すように構成されていますか? これは専用サーバーではなく、ミル共有リソースの実行にすぎないことに注意してください。したがって、execute() 呼び出しなどを介して wget で同じことを開始することはできません。

4

3 に答える 3

1

次の呼び出しが原因である可能性があります。

//if all goes well, increase time limit by a second
set_time_limit(1);

このコメントは正しくありません。これにより、set_time_limit が呼び出されてからスクリプトを実行するための 1 秒が与えられます。これを少し増やす価値があるかもしれません。

于 2012-08-17T16:39:27.950 に答える
1

上記の答えは正しいですが、一部のサーバー (Apache など) には、Apache 構成で設定された execution_time に関係なく、実行時間の長い php スクリプトを終了するスクリプトが配置されています。

php スクリプト内から php_cli プロセスを開始することで、同様の問題 (メール ニュースレターを何時間も送信すること) を解決しました。あなたのホストがそれをサポートしているなら、それはこれらの種類のものを処理するための非常に信頼できる方法です.

別の非常に優れた方法は、読み込み時間を複数のページに分散することです。これは、スクリプトでignore_user_abortを設定し、単一のチャンクを取得して終了した後に curl を使用して独自の URL を呼び出すことで実行できます。

どちらの方法でも、単一プロセスの実行時間を制限する同様の方法が必要です。CLI と Apache の両方が永続的に実行されるスクリプトをサポートする必要がありますが、しばらくすると停止することがわかりました。どちらの方法もリレー レースに似ています。100 メートル走ってから、次の労働者に仕事を渡します。

ニュースレターの内容をどのように処理したかを確認するために、コードは githubにあります

于 2012-08-19T22:22:07.823 に答える
1

PHPをどのように実行しているかによって異なります。

すぐに見る必要がありますmax_execution_time。ドキュメントには次のようにも記載されています

Web サーバーには、PHP の実行を中断する可能性のある他のタイムアウト構成がある場合があります。Apache には Timeout ディレクティブがあり、IIS には CGI タイムアウト機能があります。どちらもデフォルトで 300 秒です。具体的な詳細については、Web サーバーのドキュメントを参照してください。

fcgi 経由で PHP を実行している場合は、そこで調整する必要があるタイムアウトもあります。

編集

共有ホスティング プロバイダーに問い合わせることを検討しましたか?

于 2012-08-17T16:53:33.950 に答える