phpセッション無効分析データsorting_phpの例

WBOY
リリース: 2023-03-03 07:42:01
オリジナル
962 人が閲覧しました

phpセッション無効分析

PHP の開発プロセス中に、セッションによって生成されたファイルが自動的にクリアされないという問題に遭遇することがあります。実際、サイトにアクセスしている限り、クリアすることは不可能ではありません。十分な大きさがある場合、それらのファイルは自動的に削除されます。アクセス数が比較的少なく、ファイルが見た目に良くない場合は、php.ini で設定することでセッション ファイルの自動クリアを実現できます。具体的な設定は次のとおりです。

見つかりました

session.gc_probability = 1 session.gc_divisor = 1000

上記の 2 つのパラメータは実際にはこの確率であり、デフォルトでは 1/1000 です

session.gc_divisor = 1000 を session.gc_divisor = 100 に変更します

完全なリアルタイムを実現したい場合は、このパラメータを 1 に変更すると、確率が 100% になります

セッションの仕組みを確認してください

概要: すべての PHP リクエストは、1/100 の確率 (デフォルト値) で「セッションのリサイクル」をトリガーします。 「セッションのリサイクル」が発生すると、/tmp/sess_* ファイルがチェックされ、最終変更時間が 1440 秒 (gc_maxlifetime の値) を超える場合、これらのファイルは削除されます。これは、これらのセッションが期限切れになったことを意味します。

1. セッションはサーバー側 (通常は PHP モジュールを備えた Apache) にどのように存在しますか?

デフォルトでは、PHP はセッションを /tmp ディレクトリに保存し、ファイル名は sess_01aab840166fd1dc253e3b4a3f0b8381 のようになります。各ファイルはセッションに対応します。

リーリー
#変数名|型:長さ:値

ここでセッションファイルを削除すると、対応するセッションが無効になることを意味します。

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) を再起動します。

注: php5 では、セッションの有効期限はリサイクル メカニズムを使用します。ここで設定した時間は 86400 秒です。セッションが 86400 秒以内に変更されなかった場合、セッションは次の「リサイクル」まで削除されません。

4. セッションの「リサイクル」はいつ行われますか?

デフォルトでは、すべての PHP リクエストに対して 1/100 の確率でリサイクルが行われるため、単純に「100 個の PHP リクエストごとに 1 回のリサイクルが発生する」と理解できます。この確率は次のパラメータによって制御されます

#確率は gc_probability/gc_divisor です

session.gc_probability = 1 session.gc_divisor = 100

注 1: この場合、gc_maxlifetime=120 と仮定すると、セッション ファイルが最後に変更されたのが 120 秒前であれば、セッションは次のリサイクル (1/100 の確率) が発生するまで有効です。

注 2: セッションが session.save_path を使用してセッションを別の場所に保存する場合、セッションのリサイクル メカニズムは期限切れのセッション ファイルを自動的に処理しない可能性があります。現時点では、期限切れのセッションを定期的に手動 (または crontab) で削除する必要があります:

cd /path/to/sessions; find -cmin +24

5. いくつかの特別な状況

リサイクルメカニズムはファイルの「最終変更時刻」をチェックするため、セッションがアクティブでもセッションの内容が変更されていない場合、対応するセッションファイルは変更されておらず、リサイクルメカニズムはこれを次のようにみなします。アクティブなセッションがないため、削除されます。これは私たちが見たくないものですが、次の簡単なコードを追加することでこの問題を解決できます。

リーリー

代码会每隔60秒,尝试修改修改一次session。
总结:如果想修改session过期时间,修改变量gc_maxlifetime就可以了。php5的session采用被动的回收机制(garbage collection)。过期的session文件不会自己消失,而是通过触发“回收”来处理过期的session。

我们下面来详细看看一些其它的设置session时间的问题

 Session 过期时间参数

设定过期时间参数, 主要是设定 session.gc_maxlifetime 的参数即可, 再保险一点的设定, 就设定下面这两个参数.

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 过期时间程式

<&#63;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);
  }
}
&#63;>
ログイン後にコピー

使用方式

于程式最上方加入: start_session(600); // 代表 600 秒后会过期 (取代原本 session_start())
如果要再延长过期时间, 只要再做修改即可.

但是有个问题要注意, 就是 PHP 的 session 预设是存成 file, 所以 /tmp 可能会因这样设定而爆掉(档案太多), 通常解法是把 session 存进 DB/memcache 中.

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート