セッションは、開発において非常に重要なデータストレージ変数です。期限切れで無効なセッションを使用する際に発生する問題をいくつか紹介します。
phpセッションの無効な分析
PHPの開発プロセス中に、セッションによって生成されたファイルを自動的にクリアできないという問題によく遭遇することがありますが、実際にはクリアすることは実際には不可能ではありません。確率の問題ですが、サイトのトラフィックが十分に大きい限り、これらのファイルは自動的にクリアされます。アクセス数が比較的少なく、ファイルが見た目に良くない場合は、php.ini を構成することでセッション ファイルを自動的にクリアできます。具体的な構成は次のとおりです。
Find
session.gc_probability = 1
session .gc_pisor = 1000
上記の2つのパラメータは、デフォルトでは1/1000です
完全な実数を実現したい場合は、session.gc_pisor = 1000をsession.gc_pisor = 100に変更します。 -time の場合、このパラメーターを 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 を使用してどのメソッドが使用されるかを制御します)「現在」までの「最終変更時刻」が gc_maxlifetime (デフォルトは 1440) 秒を超える場合、セッション ファイルは次のセッションのリサイクル中に期限切れとみなされ、ファイルが変更されていない場合、セッション ファイルは削除されます。 (セッションは期限切れになります)。
簡単に言えば、Web サイトにログインし、1440 秒 (デフォルト値) 以内に操作がなかった場合、対応するセッションは期限切れになったと見なされます。そこで、php.ini ファイルの gc_maxlifetime 変数を変更して、セッションの有効期限を延長します: (たとえば、有効期限を 86400 秒に変更します)
その後、A を再起動します。 Web サービス (通常は Apache) で十分です。
デフォルトでは、php リクエストごとに 1/100 の確率でリサイクルが行われるため、単純に「100 php リクエストごとに 1 回のリサイクルが発生する」と理解できます。この確率は次のパラメータによって制御されます
#確率は gc_probability/gc_pisor ですsession.gc_pisor = 100
注 1: この場合、セッション ファイルの場合は gc_maxlifetime=120 であると仮定します。 is last 変更時刻が 120 秒前の場合、セッションは次のリサイクル (1/100 の確率) が発生するまで有効です。
因为回收机制会检查文件的“最后修改时间”,所以如果某个会话是活跃的,但是session的内容没有改变过,那么对应的session文件也就没有改变过,回收机制会认为这是一个长时间没有活跃的session而将其删除。这是我们不愿看到的,可以通过增加如下的简单代码解决这个问题: 代码会每隔60秒,尝试修改修改一次session。 我们下面来详细看看一些其它的设置session时间的问题 Session 过期时间参数 设定过期时间参数, 主要是设定 session.gc_maxlifetime 的参数即可, 再保险一点的设定, 就设定下面这两个参数. session_cookie_lifetime 设为 0 的话, 代表等到 browser 才把此 cookie 清掉.(session 和 browser cookie 是有相关的) 如果懒得想这些, 直接用下面的 function 就可以了 Session 过期时间程式 使用方式 于程式最上方加入: start_session(600); // 代表 600 秒后会过期 (取代原本 session_start()) 但是有个问题要注意, 就是 PHP 的 session 预设是存成 file, 所以 /tmp 可能会因这样设定而爆掉(档案太多), 通常解法是把 session 存进 DB/memcache 中. 相关学习推荐:PHP编程从入门到精通 以上がPHPセッションが効果がないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。<?php
if(!isset($_SESSION['last_access'])||(time()-$_SESSION['last_access'])>60)
$_SESSION['last_access'] = time();
?>
总结:如果想修改session过期时间,修改变量gc_maxlifetime就可以了。php5的session采用被动的回收机制(garbage collection)。过期的session文件不会自己消失,而是通过触发“回收”来处理过期的session。ini_set('session.cookie_lifetime', 0); // 可用 print_r(session_get_cookie_params()); 观察
ini_set('session.gc_maxlifetime', 3600); // 可用 echo ini_get("session.gc_maxlifetime"); 观察
<?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);
}
}
?>
如果要再延长过期时间, 只要再做修改即可.