ホームページ  >  記事  >  バックエンド開発  >  PHP セッション ファイルの排他ロックによるブロック問題の解決策_PHP チュートリアル

PHP セッション ファイルの排他ロックによるブロック問題の解決策_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 09:53:37746ブラウズ

PHPセッションファイルの排他ロックによるブロッキング問題の解決策

この記事では、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 またはその他のインメモリ データベースを使用してセッション データを管理できます。クラスターの使用の問題も解決できます

セッションデータの共有に問題があります。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/1000119.html技術記事この記事では、PHP セッション ファイルの排他ロックによるブロック問題の解決策を主に紹介します。この記事では、PHP にデフォルトのファイル セッション プロセッサを使用させる方法を簡単に説明します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。