ホームページ  >  記事  >  バックエンド開発  >  リクエストのブロックを防ぐための PHP のセッション ロックの分析例

リクエストのブロックを防ぐための PHP のセッション ロックの分析例

黄舟
黄舟オリジナル
2017-08-08 09:29:001253ブラウズ

この記事では、セッションロックに基づいてリクエストのブロックを防ぐためのPHPの方法を主に紹介し、PHPのセッションロックの使用と、リクエストのブロックを防ぐための関連操作スキルを例の形で分析します。この記事の例では、セッション ロックに基づいてリクエストのブロックを防ぐ PHP について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:

説明: 前の記事PHPプログラミングにおけるセッションブロックの問題と解決策では、PHPセッションブロックの解決策を簡単に分析しましたが、ここでは別の解決策を示します。

本文: 最新のブラウザでは、ホストへの同時接続数は通常 4 または 6 に制限されています。これは、Web ページが同じホストから数十のアサート ファイル (js、画像、css) を読み込む場合、同時実行の制限によりキューイングが発生することを意味します。同じか、さらに悪いことに、この問題はセッションを使用する PHP スクリプトでも発生します。

質問: phpセッションは、セッション(session_start())を操作する必要があるphpファイルをリクエストする場合、デフォルトでファイルに保存されます。セッションを実行しているプロセスがロックされ、他のリクエストがブロックされます。セッション ファイルのロックが解除されるまで、他のリクエストは session_start() で一時停止されます。

session_start())时,这个文件是会被第一个操作session的进程锁定,导致其他请求阻塞。其他请求会挂起在session_start()直到session文件解锁。

解决:

由于锁定的session文件直到脚本执行结束或者session正常关闭才会解锁,为了防止大量的php请求(需要使用$_SESSION数据)被锁定,可以在写完session后马上关闭,这样就释放了锁。

关闭session:


session_write_close();

这个技巧非常管用,尤其对于一个处理时间长的脚本。并且这个函数只是关闭了写session,读还是可以的。


// 
session_start();
//可以读写session
$_SESSION['latestRequestTime'] = time();
//关闭session
session_write_close();
//读取session
$twitterId = $_SESSION['twitterId'];

译注:

在php5.4以后,session_set_save_handler 支持了传递SessionHandlerInterface 的方式,第二个参数就是指定session_write_close() 作为回调方法的(缺省就是true),将函数 session_write_close() 注册为 register_shutdown_function() 函数。

用Memcache或者Redis做session的存储,是能解决“锁定”的问题,但处理不好会导致连接数标高(在session操作后如果有耗时操作,连接是不回收的,可以主动在session写操作完成后做session_write_close()

解決策: 🎜🎜🎜🎜大量のPHPリクエスト($_SESSIONデータの使用を必要とするリクエスト)を防ぐために、スクリプトの実行が終了するかセッションが正常に閉じられるまで、ロックされたセッションファイルのロックは解除されません。 )ロックされないようにするには、Close の直後にセッションを書き込み、ロックを解放します。 🎜🎜セッションを閉じる:🎜


🎜rrreee🎜このテクニックは、特に処理に時間がかかるスクリプトの場合に非常に便利です。また、この関数は書き込みセッションを閉じるだけで、読み取りは引き続き可能です。 🎜


🎜rrreee🎜🎜🎜翻訳注: 🎜🎜🎜🎜php5.4 以降、session_set_save_handlerSessionHandlerInterface🎜、2 番目のパラメータはコールバック メソッドとして session_write_close() を指定し (デフォルトは true)、関数 session_write_close()register_shutdown_function( ) 関数。
🎜🎜セッション ストレージに Memcache または Redis を使用すると、「ロック」問題を解決できますが、不適切な処理により多数の接続が発生します (セッション操作後に時間のかかる操作がある場合、接続は確立されません)。リサイクルされました。セッション書き込み操作が完了した後、積極的に session_write_close() 操作を実行できます)🎜

以上がリクエストのブロックを防ぐための PHP のセッション ロックの分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。