応答送信後の PHP 処理の処理
メッセージ ID とテキストを含むリクエストをサーバーから受信する場合、スクリプトは多くの場合、情報とテキストを処理する必要があります。応答を生成します。ただし、応答をすぐに送信すると、サーバー メッセージが配信済みとしてマークされ、それ以上の処理ができなくなる可能性があります。これは、即時応答の生成を必要とするが、継続的なバックエンド操作を必要とするアプリケーションでは問題になる可能性があります。
解決策: 出力バッファリングによる遅延処理
この問題に対処するには、既知の技術が使用されます。出力バッファリングを使用できるためです。このアプローチには、次の手順が含まれます。
-
遅延実行を有効にする:
- ユーザーのアクションによって中断されるのを防ぐために、ignore_user_abort(true) を呼び出します。 script.
- set_time_limit(0) を設定して、時間制約。
-
バッファ応答出力:
- ob_start() を使用して応答のバッファリングを開始します。出力。
-
部分応答の送信:
- 必要なデータを処理し、初期応答を生成し、それを次を使用してエコーします。エコー$response.
-
出力ヘッダーをフラッシュします:
-
次のヘッダーを送信します:
- Connection: close は、応答が返された後に接続が閉じることを示します。
- Content-Length: .ob_get_length()` でバッファリングされた出力の長さを指定します。
-
完全な応答送信:
- 呼び出しob_end_flush() および @ob_flush() は、バッファリングされた出力をフラッシュします。
- 残りの出力をブラウザに送信するには、flush() を呼び出します。
- PHP-FPM の場合 (PHP > 5.3.3) )、fastcgi_finish_request() を呼び出して完了します。 request.
-
処理続行:
- スクリプトは、応答がサーバーに送信されている間も処理を続行できるようになりました。
追加の考慮事項:
- 確実に実行を完了するには、die() を使用してスクリプトを明示的に終了します。特に set_time_limit=0 が使用されている場合。
- この手法により、スクリプトは常に実行されます。バックグラウンド。サーバー リソースを消費する可能性があります。
以上が即時応答を送信した後にバックグラウンドで PHP 処理を実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。