実行プロセス中にPHPスクリプトがどこにあるかを知らせるような「読み込みメッセージ」を表示しようとしています。これを行うために、プロセス全体でHTML / javascriptマークアップをエコーしようとしていますが、残りのスクリプトが実行されるまで、エコーは実行されません。AJAXを使用する以外にこれを回避する方法はありますか、それとも単に獣の性質ですか?
4 に答える
Ajaxは進むべき道のように聞こえます。1つのリクエストを使用して大きな操作を開始し、別のリクエストを使用して定期的にポーリングします。
ただし、セッションを使用している場合は、PHPのデフォルトのセッションハンドラーがsession_startをブロックするため、同じセッションに対して2つの要求を処理できないことに注意してください。2番目は、最初のセッションが閉じられるまで待機します。大きな操作が終了するまでポーリングが応答を返さない場合は、これを回避する必要があります。
操作が非常に大きい場合は、リクエスト中ではなく、バックグラウンドで実行することを検討してください。進行状況ページを1秒ごとに更新することができます。あまりエレガントではありませんが、おそらく実装ははるかに簡単です。
AJAXで両方のリクエストを行うことをお勧めします。最初のリクエストは、ジョブが完了するまで機能します。2番目のリクエストは数秒ごとに繰り返され、データベースからデータを取得して進行状況をJSONにエコーします。その後、JavaScriptによって解析され、進行状況が更新されます。その上に、ある種のプログレスバーを実行することもできます。
スクリプトにサーバーから別のファイルを要求させ、GETで情報を渡すことができます。しかし、私はこれを誰にもお勧めしません。デバッグ以外には本質的に役に立たない。
phpはサーバー上で完全に実行されるため、これはajaxを使用しても実現できません。Ajaxリクエストは、ユーザーのブラウザから実行されます。
これを実現する別の方法は、進行中にSQL挿入を行うことです。
編集:この情報がリアルタイムで必要な場合。達成するのは簡単ではありません。別のページの情報をリクエストするには、上記で投稿したものとajaxを組み合わせる必要があります。
flush
またはob_flush
(最初に使用を開始した後)を使用できますが、ob_start
ブラウザが異なれば、送信された初期のコンテンツもさまざまな方法で処理されます。常に正しい(最近チェックしていません)ルールの1つは、ほとんどのブラウザーは、特定のバイト数を受信するまで何もレンダリングを開始しないというものでした。
ご存知のように、これを行うにはもっと良い方法があります。Ajaxはおそらく最高です。ただし、このシステムを多くのバックエンド管理スクリプトで使用しており、正常に機能しています。基本的に、最初に次のことを行います。
ob_start();
echo strpad('', 1024, ' ');
ob_flush();
echo '<script>updateProgress(0.1);</script>';ob_flush();
/// do something else
echo '<script>updateProgress(0.2);</script>';ob_flush();
/// do something else...
echo '<script>updateProgress(0.3);</script>';ob_flush();