ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHP チュートリアルのセッションによって引き起こされるスクリプト ブロック問題の解決策

PHP_PHP チュートリアルのセッションによって引き起こされるスクリプト ブロック問題の解決策

WBOY
WBOYオリジナル
2016-07-13 10:34:29808ブラウズ


セッションブロックの問題を解決する方法: この問題を回避するには、セッション操作が完了した後に session_write_close() を呼び出します。


ケース 1:

セッションを使用する過程で、セッションを開いた後、同じブラウザーで同じプログラムを実行すると、異なるページがロックされます。別のブラウザではこのようなことは起こりません。

質問: session_start がブロックの原因ですか?

そこで、いくつかのページを書いてテストしたところ、セッションがブロックの原因となっているのに対し、他の 2 つの状況ではブロックが発生していないことがわかりました。

PHP バグ リストを確認したところ、誰かがこの質問をしたことがわかりました:


コードをコピーします コードは次のとおりです:
説明:
---------------
session_start の呼び出し() は他のスクリプトが終了するまで待機しているようです
同じセッションを使用していると思います。最初のリクエストは

セッションファイルを排他的にロックし、2番目のリクエストは
それを開くことができるまでブロックします。

PHP の正式な返信は次のとおりです:


コードをコピーしてください コードは次のとおりです:
時間を割いてご連絡いただきありがとうございます。しかし、これはバグではありません。これは予想されることであり、セッション ファイルがロックされています破損を避けるため。
PHPのセッション機構と組み合わせることで、ブロックの原因が判明しました。 PHPのセッション情報はファイルに書き込まれるため、1つのクライアントが1つのセッションファイルを占有します。したがって、session_start が呼び出されると、ファイルはロックされ、読み取り/書き込みモードでロックされます (プログラム内でセッションの値を変更する必要があるため)。このようにして、session_start への 2 回目の呼び出しはブロックされます。 。

最も簡単な解決策:

PHPマニュアルを確認すると、セッションデータの書き込みとセッションの終了、つまりセッションデータの書き込みとセッションの終了を同時に行うsession_write_close関数が見つかりました。したがって、セッションの終了後、この関数を呼び出してセッション ファイルを閉じ、ロックを解除できます。一般に、セッションは、PHP が ID 認証を実行できるようにユーザー ID 情報を記録するために使用されます。したがって、セッションの読み取りと書き込みは、実行後すぐに呼び出すことができます。 。


ケース 2:

前回、opencart を変更したいと言いましたが、実際には、淘宝網で商品をクロールする機能を opencart に追加したかったのですが、完了後、スクリプトがクロールしているときに問題が発生しました。プロセスが比較的遅いため、現時点では他のすべてのスクリプトの実行がブロックされ、他のスクリプトはフェッチされるまで連続して実行できません。長い間調べても結果が出なかったので、Zhihu でセッションの問題ではないかと尋ねました。session_write_close() を呼び出して解決する必要があります。それでは、session_write_close() は何に使用されるのでしょうか。マニュアルには次のように書かれています。

コードをコピー

コードは次のとおりです: 現在のセッションを終了し、セッション データを保存します。
セッション データは通常、session_write_close() を呼び出さずにスクリプトが実行された後に保存されますが、一度に 1 つのスクリプトによってのみセッションが書き込まれないようにするために、セッション データはロックされます。フレーム Web ページとセッションを同時に使用すると、このロックによりフレーム内の Web ページが 1 つずつ読み込まれることがわかります。すべてのセッション データの変更が保存された後、すぐにセッションを終了することで、ロード時間を短縮できます。

これは、私のクロール スクリプトが他のページをブロックする理由を非常によく説明しています。したがって、実行に時間がかかり、セッションを使用する ajax リクエストがある場合は、サーバー側で session_write_close() を呼び出す必要があります。そうしないと、リクエストが終了するまで他のページが一時停止されてしまいます。 ! !

http://www.bkjia.com/PHPjc/750854.html

www.bkjia.com

http://www.bkjia.com/PHPjc/750854.html技術記事セッションブロックの問題の解決策: この問題を回避するには、セッション操作が完了した後に session_write_close() を呼び出します。 ケース 1: セッションの使用中に、セッションを開いた後、同じブラウザー...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。