phpセッションの無効な分析
PHPの開発プロセス中に、セッションによって生成されたファイルが自動的にクリアできないという問題に遭遇することがよくありますが、実際にはクリアすることは実際には不可能ではありませんが、確率の問題があります。サイトにアクセスしている限り、サイトが十分に大きければ、それらのファイルは自動的に削除されます。アクセス数が比較的少なく、ファイルが見た目に良くない場合は、php.ini を設定することでセッション ファイルを自動的にクリアできます。具体的な設定は次のとおりです。
Find
session.gc_probability = 1
session.gc_divisor = 1000
上記の 2 つのパラメータは、デフォルトでは 1/1000 です
完全なリアルタイムを実現したい場合は、session.gc_divisor = 1000 を変更します。 , 次に、このパラメータを 1 に変更すると、確率が 100% になります
セッションがどのように機能するかを見てみましょう
概要: すべての PHP リクエストは、「セッションのリサイクル」をトリガーする確率が 1/100 (デフォルト値) です。 「セッションのリサイクル」が発生すると、/tmp/sess_* ファイルがチェックされ、最終変更時間が 1440 秒 (gc_maxlifetime の値) を超える場合、これらのファイルは削除されます。これは、これらのセッションが期限切れになったことを意味します。
1. セッションはサーバー側 (通常は PHP モジュールを備えた Apache) にどのように存在しますか?
デフォルトでは、php はセッションを /tmp ディレクトリに保存し、ファイル名は sess_01aab840166fd1dc253e3b4a3f0b8381 のようになります。各ファイルはセッションに対応します。
more /tmp/sess_01aab840166fd1dc253e3b4a3f0b8381 username|s:9:”jiangfeng”;admin|s:1:”0〃;
#変数名|型: 長さ: 値
ここでセッションファイルを削除すると、該当するセッションが無効になることを意味します。
2. セッションはクライアント側 (通常はブラウザ) にどのように存在しますか?
セッションはブラウザ側にあり、セッションID(サーバー側で生成された一意のID)を保存するだけで済みます。保存するには、Cookie と URL の 2 つの方法があります。セッション ID が Cookie に保存されている場合は、ブラウザーの Cookie に PHPSESID 変数があることがわかります。 URL で渡された場合は、
index.php?PHPSESID=01aab840166fd1dc253e3b4a3f0b8381 の形式で URL を確認できます。 (サーバー側では、session.use_cookies を使用して、どのメソッドが使用されるかを制御します)
3. サーバー側では、PHP はセッション ファイルの有効期限が切れているかどうかをどのように判断しますか?
「現在」までの「最終変更時刻」が gc_maxlifetime (デフォルトは 1440) 秒を超えた場合、セッション ファイルは次のセッションのリサイクル中に期限切れとみなされ、ファイルが変更されていない場合、このセッション ファイルは削除されます。 (セッションは期限切れになります)。
簡単に言えば、Web サイトにログインし、1440 秒 (デフォルト値) 以内に操作がなかった場合、対応するセッションは期限切れになったと見なされます。そこで、php.ini ファイルの gc_maxlifetime 変数を変更して、セッションの有効期限を延長します: (たとえば、有効期限を 86400 秒に変更します)
session.gc_maxlifetime = 86400
次に、Web サービスを再起動します (通常は apache) で十分です。
4. セッションの「リサイクル」はいつ行われますか?
デフォルトでは、すべての php リクエストに対して 1/100 の確率でリサイクルが行われるため、単純に「100 php リクエストごとに 1 回のリサイクルが発生する」と理解できます。この確率は次のパラメータによって制御されます
#確率は gc_probability/gc_divisor です
session.gc_probability = 1
注 1: この場合、セッション ファイルが最後の場合、gc_maxlifetime=120 であると仮定します。変更時刻が 120 秒前である場合、セッションは次のリサイクル (1/100 の確率) が発生するまで有効です。
cd /path/to/sessions; find -cmin +24 "Last Modified time" なので、セッションがアクティブであっても、セッションが変更されていない場合、対応するセッション ファイルも変更されていないため、リサイクル メカニズムはこれを長期間アクティブでなかったセッションとみなして削除します。これは私たちが見たくないものです。次の簡単なコードを追加することでこの問題を解決できます:
<?php if(!isset($_SESSION['last_access'])||(time()-$_SESSION['last_access'])>60) $_SESSION['last_access'] = time(); ?>
このコードは 60 秒ごとにセッションを変更しようとします。
概要: セッションの有効期限を変更したい場合は、変数 gc_maxlifetime を変更するだけです。 PHP5 のセッションは、受動的なリサイクル メカニズム (ガベージ コレクション) を使用します。期限切れのセッション ファイルは自然には消えませんが、期限切れのセッションは「リサイクル」をトリガーして処理されます。 セッション時間の設定に関するその他の問題を詳しく見てみましょうセッション有効期限パラメータ
有効期限パラメータを設定するには、主に session.gc_maxlifetime のパラメータを設定することです。より安全に設定するには、単に設定するだけです。次の 2 つのパラメータを設定します。
ini_set('session.cookie_lifetime', 0); // 可用 print_r(session_get_cookie_params()); 观察 ini_set('session.gc_maxlifetime', 3600); // 可用 echo ini_get("session.gc_maxlifetime"); 观察
session_cookie_lifetime 设为 0 的话, 代表等到 browser 才把此 cookie 清掉.(session 和 browser cookie 是有相关的)
如果懒得想这些, 直接用下面的 function 就可以了
Session 过期时间程式
<?php function start_session($expire = 0) { if ($expire == 0) { $expire = ini_get('session.gc_maxlifetime'); } else { ini_set('session.gc_maxlifetime', $expire); } if (empty($_COOKIE['PHPSESSID'])) { session_set_cookie_params($expire); session_start(); } else { session_start(); setcookie('PHPSESSID', session_id(), time() + $expire); } } ?>
使用方式
于程式最上方加入: start_session(600); // 代表 600 秒后会过期 (取代原本 session_start())
如果要再延长过期时间, 只要再做修改即可.
但是有个问题要注意, 就是 PHP 的 session 预设是存成 file, 所以 /tmp 可能会因这样设定而爆掉(档案太多), 通常解法是把 session 存进 DB/memcache 中.
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
更多php Session无效分析资料整理相关文章请关注PHP中文网!