長い操作で定期的にブラウザに出力

私は11Mのレコードをインポートするために LOAD DATA INFILE を使用していますが、スクリプトは他の操作を続けます。インポートには10​​分かかり、ブラウザがあきらめてから(3分後)、それ以降の操作の進行状況は表示されません。この時間がかかるクエリが実行されている間、ブラウザに何かを定期的に出力する方法はありますか? Phpmyadminはこのようなことをしているようで、ブラウザはタイムアウトしません。

2

1 答え

flush()をチェックしてください( http://php.net/manual/en/function.flush .php )またはob_flush()( http:// www .php.net/manual/en/function.ob-flush.php )。

基本的には、出力(この場合は現在のステータス)を生成し、次にサーバが現在バッファにあるものを出力するように強制します。

操作に10分かかる場合は、set_time_limit($ seconds)を使用する必要があります( http://php.net/manual/en/function.set-time-limit.php )、ページがハングアップした場合に備えて大量に設定しないように注意してください。

ステータスを10%(1分)ごとに出力する場合は、各更新がフラッシュされた後に2分のタイムアウトをリセットすることができます。このようにして、期待される時間を超えて実行されると、スクリプトはタイムアウトします。

0
追加された
ありがとうございますが、問題はPHPがmysqlクエリを完了するまで次の関数を続行しないことです。クエリを実行している間に何かをブラウザに出力する必要があります。
追加された 著者 Andy Gee,
はい、PHPのタイムアウトは20分ですが、PHPはタイムアウトしていません。 3分後にブラウザが待機を停止します。それが起こると、私はブラウザにそれ以上のアップデートを取得しません。私はループの中にある他の長いスクリプトを持っています。これらを使って、私は定期的にブラウザに何かを出力して、 "興味を持たせる"
追加された 著者 Andy Gee,
はい、それは素晴らしい考えです。私はブラウザを生かしておくために何かをポップするためにjavascriptを得ることができるので、残りの出力を見ます。これは、非常に複雑なデータベース変換スクリプトで、多くの段階があります。最終的に出力なしでcronジョブで実行されますが、今は出力が進行するにつれてそれを見る必要があります。ご協力いただきありがとうございます。
追加された 著者 Andy Gee,
私の答えの2番目の部分は、あなたの質問に答え、10分以上のタイムアウトを設定することができます。
追加された 著者 savageguy,
ヘッダーにキープアライブパラメータを設定します。このすべてが言われて、私は本当にこれがどれも行く方法ではないと思います。このような長い操作では、サーバー上のバックグラウンドプロセスで実行し、ページ上でjavascriptを使用してジョブのステータスをポーリングする必要があります。私はphpmyadminのようなWebインターフェースを使用しませんが、バックグラウンドで実行せずにステータスをポーリングするだけで非常に驚きます。私はこれが1人または非常に少数の人のためのツールだと推測しているので、おそらくこの方法で得ることができますが、それは決してスケーラブルではありません。
追加された 著者 savageguy,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com