2017-01-20 6 views
2

PHP(100 000 000レコード)で大きなデータを処理しようとしています。私は別のサーバーからすべてのレコードをダウンロードしているし、いくつかのテキストチェックを行い、おそらく10%の適切なレコードを自分のDB(MySQL)に挿入します。私の問題は次のとおりです。PHP - 大きなデータを処理する

  1. Webブラウザがちょうど終了し、処理が途中で私が 適切な記録のブラウザ数で印刷するすべてのxy checkings後

  2. を中断されたが、何も

を印刷されません

MySQLに問題はありません。スクリプトの終了後にブラウザが何かを印刷できるように見えますが、スクリプト(スレッド)を短時間中断し、ブラウザで結果を印刷してから、続行します。処理中にデータブラウザは「フリーズ」されます。何か案は?

例:すべての

for ($i=0; $i<100000000; $i++) { 
     if (($i % 1000) == 0) { //every 1000th iteration 
     echo $i;    <=== HERE I need interrupt script and let browser print my result 
     } 
    } 
+0

try sleep() '関数 –

+0

ブラウザは、実行を完了すると何かを出力します。それを参照してください.. –

+0

[PHPバックグラウンドプロセス]の可能な複製(http://stackoverflow.com/questions/265073/php-background-processes) –

答えて

1

まず、ignore_user_abortはあなたの親友です。 set_time_limit(0)とペアにして、あなたのプロセスが死ぬことを防ぎました。

第2に、ユーザーに何かを送ることは難しい作業です。その理由は、あなたが出力したものが何種類かのバッファを通過するからです。これには、PHP、Apache、アプリケーションが使用するロードバランサ、ブラウザなどが含まれます(注意:通常、バッファは簡単に設定できます(無効になっていますが、理由があります)。したがって、単にechoが動作するとは限りません。

この問題に対処するにはいくつかのことがあります。

解決策の1つは、PusherやAbly(私はより良い計画の方が後者が好ましい)のようなリアルタイム通信サービスを使用することです。また、Webソケットを使用して独自のソリューションを展開することもできます。それから、1k回の繰り返しごとにメッセージを送信して、JSでそれを聞いてください。ボーナスは、ユーザーのブラウザがクラッシュしてブラウザを再オープンすると、プロセスと更新プログラムが正しく実行されていることです。これは(私の意見では)これを行うための最も適切な方法ですが、正しいことを得るのは難しいかもしれません。

もう1つの解決策は、データを分割することです。つまり、JSはajaxリクエストを送信し、1k行を処理します。echoと死んでいます。次に、JSは次の2k行を処理する別の要求を送信します。これは簡単に行うことができますが、依頼を送信するクライアントに依存します。また、 "異なるサーバからすべてのレコードをダウンロードする"は、このメソッドを使用するのが難しいかもしれません。

関連する問題