ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHPチュートリアルでsession_startを呼び出した後に必ずページが読み込まれる問題の調査
この記事では、PHP で session_start を呼び出した後に必ずページが読み込まれる問題についての研究を紹介します。必要な方は参考にしてください。 PHP ページの実行時間は比較的長く (約 15 秒)、このページが完了しない限り、他のページへのアクセスは長時間にわたって読み込まれ、そのページが完了して初めて残りのページを開くことができます。 。
何が起こっているのでしょうか? 確認すると、両方のページが SESSION 操作で設計されています。 サンプルコードは次のとおりです。
1 ページ目:
2ページ目:
ページ 1 にアクセスするときに、同時にページ 2 にアクセスします。ページ 1 が完了するまで、ページ 2 がロードされたままであることがわかります。
問題の原因は何ですか?
答えは、PHP の SESSION メカニズムが問題を引き起こしているためです。PHP は、ページ コードが実行された後にのみ SESSION データをファイルに書き込みます。ページが実行されない場合、対応する SESSION ファイルは常にロックされ、他のページはロックされます。この SESSION ファイルにアクセスすると待機状態を維持することしかできないため、ページ 2 はページ 1 が実行されるまで待機する必要があります。
原因がわかったところで、この問題をどう解決すればいいのでしょうか?
答えは簡単です。PHP はカーネル内に関連するインターフェイスを提供しています: function session_write_close
この関数の公式ドキュメントの説明は次のとおりです。
通常、セッション データはスクリプトの終了後に保存され、session_write_close() を呼び出す必要はありませんが、同時書き込みを防ぐためにセッション データはロックされているため、セッションでフレームセットを同時に使用すると、常に 1 つのスクリプトのみが動作します。このロックにより、フレームが 1 つずつロードされます。セッション変数へのすべての変更が完了したらすぐにセッションを終了することで、すべてのフレームのロードに必要な時間を短縮できます。
通常、セッション データは、session_write_close 関数を呼び出さずにスクリプトが終了した後に自動的に保存されます。ただし、データが同時に書き込まれるのを防ぐために、セッションはファイルをロックして、一度に 1 つのスクリプトのみがファイルにアクセスできるようにします。フレーム ページを使用し、同時に SESSION にアクセスすると、ファイルのロックによりフレームがロードされ続ける状況が発生します。 SESSION 変数の処理直後にこの関数を使用すると、複数のフレームのロード時間を短縮できます。
前の質問と同様に、SESSION データを操作した直後に session_write_close 関数を直接呼び出してセッション データを書き込むことができるため、他のページの通常の操作には影響しません。コードは以下のように表示されます。