ホームページ >システムチュートリアル >Linux >PHPのセッションガベージコレクションメカニズムを理解する

PHPのセッションガベージコレクションメカニズムを理解する

王林
王林オリジナル
2024-08-08 09:08:11360ブラウズ
1. phpのセッション生成メカニズム

まず、PHP でセッションがどのように生成されるかを分析しましょう。セッションを設計する目的は、HTTP プロトコル (ステートレス) の欠点を補うために、各ユーザーのさまざまな状態を維持することです。ここで質問があります。セッションは各ユーザーのステータスを維持するためにサーバーに保存されることは誰もが知っていますが、ユーザーを区別するために何を使用するのでしょうか?このとき、Cookie を使用する必要があります。コード内で session_start(); を呼び出すと、PHP は SESSION ストレージ ディレクトリ (デフォルトは /tmp/) とクライアントの Cookie ディレクトリにファイルを生成します。セッションファイル名は次のようになります:

PHPのセッションガベージコレクションメカニズムを理解する

現時点では、session_start(); に次の 2 行のコードを追加したときの形式はセッション ファイルにありません。

コードをコピーしますコードは次のとおりです: リーリー
コードをコピーしますコードは次のとおりです: リーリー
もう一度クッキーを見てください:

PHPのセッションガベージコレクションメカニズムを理解する

サーバーが自動的に Cookie を生成したことがわかります。Cookie の名前は「PHPSESSID」で、Cookie の内容は文字列です。実際、この文字列は

{SESSIONID} です。おそらく、セッションを使用するとき、PHP は最初に一意の SESSIONID 番号 (2bd170b3f86523f1b1b60b55ffde0f66 など) を生成し、次にサーバーのデフォルト ディレクトリにファイル名 sess_{SESSIONID} のファイルを生成することをすでに理解しているかもしれません。同時に、現在のユーザーのクライアント側で Cookie が生成されます。その内容はすでに述べられています。このようにして、PHP はユーザーごとに SESSIONID を生成します。これは、ユーザーごとに 1 つのセッション ファイルを意味します。 PHP は、初めてユーザーのセッションを使用するときに、クライアントに Cookie を書き込みます。ユーザーが次回アクセスすると、ブラウザーはこの Cookie を取得した後、内部の SESSIONID を読み取って保持します。セッション ディレクトリに移動してセッション ファイルを見つけます。見つかったら$_SESSION['blog']を呼び出すと表示されます。

2. php のセッション有効期限のリサイクルメカニズム
セッションの生成と動作原理を理解し、セッション ディレクトリに多数のセッション ファイルが存在することがわかりました。もちろん、これらのファイルは永久に存在してはならないため、PHP は期限切れのリサイクル メカニズムを提供する必要があります。 php.ini で

session.gc_maxlifetime はセッションの生存時間を設定します (デフォルトは 1440 秒)。セッション ファイルの最終更新時間が生存時間を超えた場合、セッション ファイルは期限切れとみなされます。次回セッションがリサイクルされるときに削除されます。次のセッションはいつリサイクルされますか?これは php リクエストの数に関係します。 PHP の内部メカニズムでは、php が N 回リクエストされると、リサイクルメカニズムが 1 回トリガーされます。リクエストがトリガーされる回数は、次の 2 つのパラメーターによって制御されます:

コードをコピーしますコードは次のとおりです:
session.gc_probability = 1session.gc_divisor = 100

这是php.ini的默认设置,意思是每100次PHP请求就有一次回收发生。概率是 gc_probability/gc_divisor 。我们了解了服务器端的session过期机制,再来看看客户端的cookie的过期机制。

如果cookie失效了浏览器自然发送不了cookie到服务器,这时即使服务器的session文件存在也没用,因为PHP不知道要读取哪个session文件。我们知道PHP的cookie过期时间是在创建时设置的,那么PHP在创建session的同时为客户端创建的cookie的生命周期是多久呢?这个在php.ini中有设置:session.cookie_lifetime 。这个值默认是0,代表浏览器一关闭SESSIONID就失效。那就是说我们把session.gc_maxlifetime和session.cookie_lifetime设置成同一个值就可以控制session的失效时间了。

3、php中session的客户端存储机制

由上面的介绍我们可以知道,如果用户关闭了cookie,那我们的session就完全没法工作了。是的,确实是这样。php中session的客户端存储机制只有cookie吗?不是的。既然我们的SESSIONID 不能通过cookie传递到各个页面,那我们还有另一个法宝,就是通过页面GET传值的方式。

PHP可以在cookie被禁用时自动通过GET方式跨页传递SESSIONID,前提是设置php.ini的session.use_trans_sid为1。这时当我们在客户端禁用了cookie时使用了session,并在当前页面通过点击链接到另一页面时,PHP会自动在链接上添加SESSIONID参数,像这样:nextpage.php?SESSIONID=2bd170b3f86523f1b1b60b55ffde0f66。我想你应该看到了这种方式的缺点:好像不够安全啊。

以上がPHPのセッションガベージコレクションメカニズムを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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