PHP にはセッションに隠れた危険性が伴います (セッション ファイルの排他ロックによりブロックが発生します)

WBOY
リリース: 2016-06-23 13:37:09
オリジナル
841 人が閲覧しました

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


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!