ホームページ >バックエンド開発 >PHPチュートリアル >PHP にはセッションに隠れた危険性が伴います (セッション ファイルの排他ロックによりブロックが発生します)
PHP にはセッションに隠れた危険が伴います (セッション ファイルの排他ロックによりブロックが引き起こされます)
PHP のデフォルトのセッション ハンドラーは session.save_handler = files (つまり、ファイル) です。同じクライアントが複数のリクエストを同時に送信し (ページ上で同時に複数のリクエストを送信する ajax など)、スクリプトの実行時間が長い場合、セッション ファイルがブロックされ、パフォーマンスに影響します。 PHP はリクエストごとに session_start() を実行するため、ファイルの排他ロックを取得し、排他ロックはリクエストが処理された後にのみ解放されます。このように、複数のリクエストを同時に行うとブロックが発生します。解決策は次のとおりです:
(1) セッション変数を変更した後、すぐに session_write_close() を使用してセッション データを保存し、ファイル ロックを解除します。
[php] plaincopy を表示
session_start();
$_SESSION['test'] = 'test';
session_write_close( );
//do something
(2) session_set_save_handler() 関数を使用してカスタム セッション処理を実装します。
[php] plaincopy を表示
function open($savePath, $sessionName)
{
echo 'open が呼び出されます';
return true;
}
関数 close()
{
return true;
関数 read($sessionId)
{
エコー '
return '';
function write($sessionId, $data)
{
echo 'write が呼び出されます';
}
function destroy($sessionId)
{
echo 'destroy が呼び出されます';
return true;
function gc($lifetime)
{
echo 'gc が呼び出されます';
true を返す
}
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
session_start();
$_SESSION['foo'] = "bar";
もちろん、php 5.4.0 以降では、SessionHandlerInterface インターフェイスを実装するか、SessionHandler クラスを継承することで使用できます。
[php]plaincopy を表示
class MySessionHandler extends SessionHandler {
public function __construct()
{
}
public function open($save_path, $session_id)
{
}
public function close()
{
}
public create_sid()
{
}
public function read($id)
{
}
public function write($id) , $data)
{
}
public destroy($id)
{
}
}
$handler = new MySessionHandler();
//第 2 パラメータの関数session_write_close() 注釈は register_shutdown_function() 関数です。
session_set_save_handler($handler, true);
は、mysql またはその他の内部データ パッケージを使用してセッション データを管理するために、上のコードを具体的に実装および封入できます。参考来源:
PHP自带Session隐患(セッション文件独占锁引起阻止)
http://www.lai18.com/content/407206.html