[解決済み] PHPでセッションタイムアウトを変更する方法は?
質問
phpでセッションのタイムアウトを延長したいのですが。
php.iniファイルを修正することで可能なことは知っています。 しかし、私はそれにアクセスすることができません。
ということは、phpのコードだけで可能なのでしょうか?
どのように解決するのですか?
セッションタイムアウトは、厳密な保証を望むなら、コードで実装されなければならない概念です。 唯一の方法 を使えば、どのセッションもX分後には生き残れないということを、絶対に確認することができます。
この要件を少し緩和しても構わない、そして 下限 期間に対する厳密な制限の代わりに、カスタムロジックを書くことなく、簡単に実行できます。
リラックスした環境での利便性:方法と理由
もし
セッションがクッキーで実装され(おそらくそうでしょう)、かつ
もし
クライアントが悪意を持っていない場合、特定のパラメータを調整することで、セッション時間の上限を設定することができます。PHP のデフォルトのセッション処理でクッキーを使用している場合、セッションの持続時間を設定するために
session.gc_maxlifetime
とともに
session_set_cookie_params
は、このように動作するはずです。
// server should keep session data for AT LEAST 1 hour
ini_set('session.gc_maxlifetime', 3600);
// each client should remember their session id for EXACTLY 1 hour
session_set_cookie_params(3600);
session_start(); // ready to go!
これは、サーバーが少なくとも1時間以上操作されないとセッションデータを保持するように設定し、クライアントには同じ時間が経過したらセッションIDを忘れるように指示することで機能します。 期待される結果を得るためには、これらの両方の手順が必要です。
-
もしあなたがクライアントに1時間後にセッションIDを忘れるように指示しなければ(あるいはクライアントが悪意を持ってあなたの指示を無視することを選んだ場合)、彼らは同じセッションIDを使い続け、その有効期間は非決定的となります。これは、サーバー側で寿命が切れたセッションはすぐにガベージコレクションされるわけではなく、あくまで セッションGCが起動するたびに .
GCは潜在的に高価なプロセスなので、一般的に確率はむしろ小さいかゼロです(膨大な数のヒットを得るウェブサイトは、おそらく完全に確率的なGCを放棄し、X分ごとにバックグラウンドで起こるようにスケジュールします)。どちらの場合も(非協力的なクライアントを仮定して)、有効なセッション寿命の下限は次のようになります。
session.gc_maxlifetime
しかし、その上限は予測不可能です。 -
を設定しない場合
session.gc_maxlifetime
この場合、まだセッション ID を覚えているクライアントはそれを表示しますが、サーバーはそのセッションに関連するデータを見つけられず、あたかもセッションが開始されたばかりであるかのように動作します。
クリティカルな環境における確実性
カスタムロジックで 上限 を設定することで、厳密な設定が可能になります。
残りのセッションデータと一緒に上限値を保存することで、これを実行します。
session_start(); // ready to go!
$now = time();
if (isset($_SESSION['discard_after']) && $now > $_SESSION['discard_after']) {
// this session has worn out its welcome; kill it and start a brand new one
session_unset();
session_destroy();
session_start();
}
// either new or old, it should live at most for another hour
$_SESSION['discard_after'] = $now + 3600;
セッション ID の永続化
これまでのところ、各セッションIDの正確な値には全く関心がなく、必要な限りデータが存在することだけが要件でした。セッション ID が重要であるという (ありそうもない) ケースでは、セッション ID の再生成に注意が必要です。
session_regenerate_id
が必要です。
関連
-
[解決済み】変な電話番号を生成するフェイカー?
-
[解決済み】未定義の関数mysql_query()をLoginで呼び出す【重複
-
[解決済み] PHPのエラーを表示させるにはどうしたらいいですか?
-
[解決済み] PHPでパスワードをハッシュ化するためにbcryptを使用するにはどうすればよいですか?
-
[解決済み] PHPのセッションを30分後に失効させるにはどうしたらいいですか?
-
[解決済み] PHP 配列をキーではなく値で削除する
-
[解決済み] php.iniはどこにありますか?
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
-
[解決済み】PHPパスワードのハッシュとソルトの安全性について
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】SQLSTATE[42000]: 構文エラーまたはアクセス違反が発生しました。1064 SQL 構文にエラーがあります - PHP - PDO [重複]。
-
[解決済み】空の配列要素を削除する
-
[解決済み】不明なMySQLサーバーのホスト
-
[解決済み】 PHP 未定義関数の呼び出し
-
[解決済み】ディレクトリ内のファイル数を数える PHP
-
[解決済み】Chrome net::ERR_INCOMPLETE_CHUNKED_ENCODING エラーが発生しました。
-
[解決済み】メッセージ。Trying to access array offset on value of type null [重複]配列のオフセットにアクセスしようとしています。
-
[解決済み] 警告:mysqli_fetch_array()は、パラメータ1がmysqli_resultであることを期待する、オブジェクトはで指定された。
-
[解決済み】count()パラメータは配列かlaravelのcountableを実装したオブジェクトでなければならない
-
[解決済み] PHPのセッションを30分後に失効させるにはどうしたらいいですか?