私が開発している PHP Web アプリの一部では、次のことを行う必要があります。
- PHP スクリプトに対して AJAX 要求を行います。これには 1 秒から 1 時間かかる可能性があり、完了したらページに出力を表示します。
- 長時間実行される PHP スクリプトのステータス変数によって定義される Web ページの読み込みバーを定期的に更新します。
- 長時間実行される PHP スクリプトが AJAX リクエストがキャンセルされたかどうかを検出できるようにして、適切かつタイムリーにシャットダウンできるようにします。
私の現在の解決策:
- client.php: request.php への AJAX リクエストを作成し、最初のリクエストが完了するまで、1 秒ごとに status.php へのリクエストを作成します。アプリの複数のインスタンスが実行されている場合に備えて、一意の識別子 (uid) を生成して渡します。
- request.php:進行するたびに、現在の進行状況のパーセンテージを $_SESSION["progressBar"][uid] に保存します。(毎回 session_start() と session_write_close() を実行する必要があります。) 終了すると、client.php が必要とするデータを返します。
- status.php: session_start() を実行し、$_SESSION["progressBar"][uid] を返し、session_write_close() を実行します。
足りないところ:
私のソリューションは、最初の 2 つの要件を満たしています。3 つ目は、 request.phpで connection_aborted() を使用して、リクエストがキャンセルされたかどうかを確認したいと考えています。しかし、ドキュメントは言う:
PHP は、クライアントに情報を送信しようとするまで、ユーザーが接続を中止したことを検出しません。単純に echo ステートメントを使用しても、情報が送信されるとは限りません。flush() を参照してください。
無意味な出力を出力することもできますが、PHPはsession_start() を呼び出すたびに Cookie を送信する必要があります。同じセッションを使用したいのですが、ドキュメントには次のように書かれています:
セッション cookie を使用する場合、session_id() に id を指定すると、現在のセッション id が設定されているものと同じであるかどうかに関係なく、session_start() が呼び出されたときに常に新しい cookie が送信されます。
解決策についての私のアイデアは、どれも満足していません:
- ステータス データベース、一時ファイルへの書き込み、またはタスク管理システム。これは私が必要としているものよりも複雑に思えます!
- カスタム セッション ハンドラ。これは基本的に上記のソリューションと同じです。
- 進行状況データと結果データの両方を 1 つの要求でストリーミングします。これですべてが解決しますが、基本的には AJAX を再実装することになります。それは正しくありません。
何か足りないと教えてください!接続が終了したときに PHP がすぐに認識しないのはなぜですか? まったく同じものであっても、PHP が Cookie を再送信する必要があるのはなぜですか? これらの質問のいずれかへの回答は大きな助けになります!
心から感謝します。