4

セッションタイムアウト時間を以下のように20分に設定しました。2、3分でセッションタイムアウトが発生する場合があります。

ini_set('session.gc_maxlifetime',   1200);

ini_set('session.cookie_lifetime',  1200);

ini_set('session.gc_probability',   1);

ini_set('session.gc_divisor',   100);

何が問題になる可能性がありますか?

4

1 に答える 1

1

ユーザーが他のページを閲覧しても、20 分の有効期限はリセットされません。問題はこのコメントで説明されています:

session_set_cookie_params() を使用する場合、PHP のセッション コントロールはセッションの有効期間を正しく処理しないため、ユーザーがサイトにアクセスするたびにセッションの有効期限を変更する必要があります。では、ここで問題です。

$lifetime=600;
session_set_cookie_params($lifetime);
session_start();

このコードは、ユーザーがサイトに戻ったり、ページを更新したりしても、セッションの有効期間を変更しません。ユーザーが何度ページをリクエストしても、セッションは $lifetime 秒後に期限切れになります。したがって、次のようにセッション Cookie を上書きするだけです。

$lifetime=600;
session_start();
setcookie(session_name(),session_id(),time()+$lifetime);

これで、有効期間が適切な値に設定された同じセッション Cookie が作成されました。

ブラウザを閉じたときに Cookie の有効期限が切れるように、そのままにsession.cookie_lifetimeしておくことをお勧めします。0そうしないと、ブラウザーを閉じるとセッションが終了すると想定しているユーザーは、20 分のタイムアウト前にブラウザーを再度開いたときに驚かれることでしょう。

gc_xxxx の設定に関する編集

gc_probability = 1、gc_divisor = 1、gc_maxlifetime = 1200

1/1は、PHP が呼び出しごとにセッション ファイルの日付をチェックすることを意味しますsession_start

gc_probability = 1、gc_divisor = 100、gc_maxlifetime = 1200

1/100つまり、PHP はセッション ファイルの日付をランダムにチェックしますが、およそ 100 回のsession_start呼び出しごとに 1 回チェックします。

日付チェック自体は、セッション ファイルのアクセス時間を gc_maxlifetime と比較することで構成されます。過去 (例) 20 分間アクセスされていない場合、ファイルを削除します。

そうは言っても、タイムアウト (またはタイムアウトが 0 のときにブラウザーを閉じる) が原因で Cookie の有効期限が切れた場合、ブラウザーは期限切れのセッション ID Cookie の送信を停止するため、セッションはすぐに期限切れになります。その場合、PHP は新しいセッション ID Cookie を発行します。期限切れの Cookie に関連付けられたセッション ID ファイルは破棄され、アクセスできなくなります。したがって、上記のようにいつでもガベージコレクションが行われます。

最後に、(i) セッション ID Cookie の有効期限 (ii) を確認し、タイムアウトのある Cookie はページにアクセスしたり更新したりしても更新されないことを覚えておくことで、特定の問題を解決できます。

于 2013-03-04T09:09:51.503 に答える