ホームページ  >  記事  >  バックエンド開発  >  php セッションの gc メカニズムは、window と ununtu では異なります。

php セッションの gc メカニズムは、window と ununtu では異なります。

WBOY
WBOYオリジナル
2016-06-23 13:29:341024ブラウズ

Mr_jing の前回のセッション記事を見てとても勉強になりました。偶然にも、勝利時にセッションの問題も発生しました。彼は記事の最後で興味深いことを述べていましたが、それを見たとき、とても甘い運命だと感じました。それから、私は自分自身で比較的水っぽい日記を書きました。session_set_save_handler の実行シーケンスのメカニズムは理解しましたが、それでも諦めるつもりはありませんでした。セッションが Linux で動作するかどうかを確認したかったのです (Win では間違いなく動作しません)。 。

win でセッション gc メカニズムをテストします

  • まず win での環境 phpstudy について説明します
  • 2.php.ini 設定

    3. コードはセッションに書き込むために write.php を開始します。値は次のとおりです。現在のタイムスタンプ

    <?php   session_start();$_SESSION['nametime']=date('Y-m-d H:i:s',time());echo '已经写入'.$sessionSavePath = ini_get('session.save_path');var_dump($_SESSION);

    4. セッション コードを読み取ります

    <?phpecho 'maxlifetime'. ini_get('session.gc_maxlifetime')."<br>";echo 'gc_probability'.ini_get('session.gc_probability')."<br>";echo 'gc_divisor'.ini_get('session.gc_divisor')."<br>";session_start();echo '<hr>'.'Session::=>';var_dump($_SESSION);echo '<hr>'.'Cookie::=>';var_dump($_COOKIE);echo '<hr>';echo "<br>ReadTime".date('Y-m-d H:i:s',time());

    5. read.php
    を実行し、書き込み時間が 17:57:04 であることを確認します

    6. セッションを読み取ると、セッションの値が表示されます。 (上の赤い楕円形の円) 時間と書き込み時間は両方とも同じ

    17:57:04 です。下の readtime 行は 13:58:56 であることに注意してください

    今のところ、問題はありません勝つ。たとえセッションの最大存続期間 (session.gc_maxlifetime) が 5 秒であっても、gc 比率は 1:1 であり、これは 100% のリサイクルを意味するためです。

    ただし注意:
    gc リサイクルは session_start から始まり、open、read、gc の順に実行されます。
    詳細については、ここをクリックしてセッションの実行順序を確認できます。

    つまり、特定のセッションの有効期限が切れたとしても、それを読み取ることは依然として価値があり、そうでないと次回 gc によって削除されます。

    (最初の読み取りに値がある場合、ユーザーがログインしているかどうかを正確に判断できないと考える友人もいるかもしれません。しかし、実際の運用環境では、それは決して単一のユーザーではありません。 session_start メカニズムをトリガーするだけでは十分ではありません。 !
    Win プラットフォームで read.php ページを更新し続けると、セッション値を常に取得できます。これはおかしい、リサイクルすべきだ。どうしてずっと手に入れられるんだろう。理解すると、セッション gc はファイルの最終変更時刻を現在時刻および ini に設定されている maxlifetime 時刻と比較し、リサイクル メカニズムをトリガーします。

    写真を撮りましょう

    ここが奇妙な部分です

    1. このセッションを削除してから直接書き込むと、作成時間が削除直前の作成時間と同じであることがわかります。名前が同じなのはわかるけど、時間が同じってどういうことだ! Windowsが怠けてゴミ箱を取り戻したのでしょうか?私が彼を空にしたときも同じことが起こりました。
    GIF画像を添付します(とても退屈です〜、この画像を開くにはIEブラウザを使用するか、美しいピクチャーショー、acdseeなどを使用してください)


    LinuxでのセッションのGC

    ローカルに構築したVirtualbox(ubuntuでのランプ) )

    構成は以下のとおりです:

    次に、動的図が表示されます: 書き込みセッションを表示し、セッション ファイルのステータスを確認してから読み取ります。最初に読み取られたときは価値があり、2 回確認されます。 stat sess** ファイルがまだ存在しているのですが、更新すると値が消えてしまいました。また、セッション プロセスが open read (gc) write close であることも確認されます。初めて値を取得したのは、write の読み取り値ではなく、以前に開いたときであることに注意してください



    最後に書いています:
    記事の書き方は少し荒くて乱雑です。
    最後に、ご指導頂いた諸先輩方、特にcfc4nx様に感謝申し上げます。

    次回はもっとわかりやすく書きます。 。

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