この記事では、PHPセッションファイルの排他ロックによるブロッキング問題を中心に紹介します この記事では、PHPで発生しやすいブロッキング問題の解決方法について説明します。デフォルトのファイルセッションプロセッサを必要としているので、参照してください
PHP のデフォルトのセッションハンドラーは session.save_handler = files (つまりファイル) です。同じクライアントが複数のリクエストを同時に送信し (ページ上で同時に複数のリクエストを送信する ajax など)、スクリプトの実行時間が長い場合、セッション ファイルがブロックされ、パフォーマンスに影響します。 PHP はリクエストごとに session_start() を実行するため、ファイルの排他ロックを取得し、排他ロックはリクエストが処理された後にのみ解放されます。このように、複数のリクエストを同時に行うとブロックが発生します。解決策は次のとおりです:
(1) セッション変数を変更したら、すぐに session_write_close() を使用してセッションデータを保存し、ファイルのロックを解除します。
?
1 2 3 4 5 6 |
session_start();
$_SESSION['テスト'] = 'テスト'; session_write_close();
//何かしてください |
(2) session_set_save_handler()関数を使用してカスタムセッション処理を実装します。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
関数オープン($savePath, $sessionName) { echo 'オープンが呼び出されます'; true を返す; }
関数close() { echo 'close が呼び出されます'; true を返す; }
関数読み取り($sessionId) { echo '読み取りが呼び出されます'; 戻る ''; }
関数書き込み($sessionId, $data) { echo '書き込みが呼び出されます'; true を返す; }
関数破棄($sessionId) { エコー「破壊が呼び出されます」; true を返す; }
関数 gc($lifetime) { echo 'gc が呼び出されます'; true を返す; }
session_set_save_handler("open", "close", "read", "write", "destroy", "gc"); register_shutdown_function ( 'session_write_close' );
session_start();
$_SESSION['foo'] = "バー"; |
もちろん、PHP 5.4.0以降では、SessionHandlerInterfaceインターフェースを実装したり、SessionHandlerクラスを継承したりすることで利用できます。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
クラス MySessionHandler は SessionHandler を拡張します {
パブリック関数 __construct() { }
パブリック関数 open($save_path, $session_id) { }
パブリック関数 close() {
}
パブリック関数 create_sid() { }
パブリック関数 read($id) { }
パブリック関数 write($id, $data) { }
パブリック関数 destroy($id) { } }
$handler = 新しい MySessionHandler();
//2 番目のパラメーターは、関数 session_write_close() を register_shutdown_function() 関数として登録します。 session_set_save_handler($handler, true); |
上記のコードを具体的に実装してカプセル化し、mysql またはその他のインメモリ データベースを使用してセッション データを管理できます。クラスターの使用の問題も解決できます
セッションデータの共有に問題があります。