PHP はセッション ファイルのブロックをどのように解決しますか?この記事では、主に PHP セッション ファイルの排他ロックによって引き起こされるブロックについて紹介し、PHP がデフォルトのファイル セッション プロセッサを使用する場合に発生しやすいブロック問題の解決策を共有します。お役に立てれば幸いです。
PHP のデフォルトのセッションハンドラーは session.save_handler = files (つまり、ファイル) です。同じクライアントが複数のリクエストを同時に送信し (ページ上で同時に複数のリクエストを送信する ajax など)、スクリプトの実行時間が長い場合、セッション ファイルがブロックされ、パフォーマンスに影響します。 PHP はリクエストごとに session_start() を実行するため、ファイルの排他ロックを取得し、排他ロックはリクエストが処理された後にのみ解放されます。このように、複数のリクエストを同時に行うとブロックが発生します。解決策は次のとおりです:
(1) セッション変数を変更した後、すぐに session_write_close() を使用してセッション データを保存し、ファイル ロックを解除します。
session_start(); $_SESSION['test'] = 'test'; session_write_close(); //do something
(2) session_set_save_handler()関数を使用してカスタムセッション処理を実装します。
function open($savePath, $sessionName) { echo 'open is called'; return true; } function close() { echo 'close is called'; return true; } function read($sessionId) { echo 'read is called'; return ''; } function write($sessionId, $data) { echo 'write is called'; return true; } function destroy($sessionId) { echo 'destroy is called'; return true; } function gc($lifetime) { echo 'gc is called'; return true; } session_set_save_handler("open", "close", "read", "write", "destroy", "gc"); register_shutdown_function ( 'session_write_close' ); session_start(); $_SESSION['foo'] = "bar";
もちろん、php 5.4.0以降でも、SessionHandlerInterfaceインターフェースを実装したり、SessionHandlerクラスを継承したりすることで利用できます。
class MySessionHandler extends SessionHandler { public function __construct() { } public function open($save_path, $session_id) { } public function close() { } public function create_sid() { } public function read($id) { } public function write($id, $data) { } public function destroy($id) { } } $handler = new MySessionHandler(); //第2个参数将函数 session_write_close() 注册为 register_shutdown_function() 函数。 session_set_save_handler($handler, true);
上記のコードを具体的に実装してカプセル化し、mysql またはその他のメモリ内データベースを使用してセッション データを管理できます。クラスター使用時のセッションデータ共有の問題も解決できます
。
関連する推奨事項:
PHP は Redis を使用してセッションインスタンス共有を実装します
以上がPHP はセッションファイルのブロックを解決しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。