記事内にはプロモーションが含まれています

PHPでセッションの有効期限を設定する方法

PHPでセッションの有効期限を設定する方法 プログラミングの疑問解決

PHPでログイン機能やWebアプリケーションを開発する際、ユーザーの状態を維持するために不可欠なのが「セッション」です。

しかし、デフォルト設定のままでは、ユーザーがブラウザを閉じるとセッション情報が消えてしまいます。

「ログイン状態を1週間維持したい」「一定時間操作がなければ自動的にログアウトさせたい」といったことを実現するには、セッションの有効期限を正しく設定する必要があります。

しかし、PHPのセッション有効期限には、実は2つの異なる概念が存在し、両方を適切に設定しないと意図した通りに動作しません。

そこでこの記事では、PHPにおけるセッション有効期限の仕組みから、具体的な設定方法、そしてセキュリティを高めるためのベストプラクティスまで、初心者にもわかりやすく解説していきます。

【本記事の信頼性】

  • 執筆者は元エンジニア
  • 大手プログラミングスクールのWebディレクター兼ライターを経験
  • 自らも地元密着型のプログラミングスクールを運営
忖度一切なし!
受講生から評判の良いプログラミングスクール
スクール
特徴
受講料金
大手比較サイトで4年連続人気NO.1!受講生からの評判も非常に高く、Web系のエンジニアを目指すならRUNTEQ一択。
550,000円
(最大44万円の給付金が適用される)
月単価80万円以上の現役エンジニア講師による指導!一度入会すればサポートは半永久的。
498,000円
格安で質の高いWeb制作スキルを習得したい人におすすめ!業界最安級の料金でありながら、コミュニティやサポートが充実。
129,800円~
完全無料でプログラミングが学べる貴重なスクール!最短1ヶ月で卒業可能。ゼロスク運営会社への就職もできる。
完全無料
長期間に渡って学習し、希少人材を目指す人に最適なスクール!受講料は高いものの、高収入を得られる人材を目指せる。
96~132万円

なぜセッションの有効期限が重要なのか?

PHPのセッションは、デフォルトではブラウザを閉じるまでの間だけ有効です。

これは、セッションIDを保持している「セッションクッキー」の有効期限が0(ブラウザの終了時まで)に設定されているためです。

この挙動は一時的な情報を扱うには便利ですが、以下のような要件には対応できません。

  • ログイン維持機能:ユーザーが一度ログインしたら、ブラウザを閉じても数日間はログイン状態を維持したい。
  • セキュリティ向上:公共のPCなどで利用された場合、長時間セッションが残り続けると、第三者による「なりすまし」のリスクが高まるため、一定時間で確実にセッションを無効化したい。

これらの機能を実現するためには、セッションの有効期限を意図的にコントロールする必要があるのです。

セッションの有効期限は2種類ある

PHPのセッション有効期限を理解する上で最も重要なポイントは、「サーバー側」と「ブラウザ側」の2つの有効期限が存在し、両方が関連し合っているという点です。

サーバー側の有効期限 (session.gc_maxlifetime)

これは、サーバー上に保存されているセッションデータファイルそのものの有効期限です。

PHPには「ガベージコレクション(GC)」という仕組みがあり、最後にアクセスされてから一定時間(デフォルトでは1440秒 = 24分)が経過したセッションファイルを、一定の確率で自動で削除します。

この時間を制御するのがsession.gc_maxlifetimeという設定です。

例えば、この値を3600(1時間)に設定すると、1時間以上アクセスのないセッションファイルがサーバーから削除される対象となります。

ただし、いくらブラウザがセッションIDを保持していても、サーバー側に対応するセッションファイルがなければ、そのセッションは無効になります。

ブラウザ側の有効期限 (session.cookie_lifetime)

こちらは、ユーザーのブラウザに保存される「セッションIDを記録したクッキー」の有効期限です。
この時間を制御するのがsession.cookie_lifetimeです。

デフォルトでは0に設定されており、これは「ブラウザを閉じるまで」を意味します。

もしこの値を86400(1日)に設定すれば、ユーザーはブラウザを閉じても、1日間は同じセッションIDをサーバーに送り続けるため、セッション(例:ログイン状態)が維持されます。

しかし、いくらこちらの有効期限を長くしても、サーバー側でセッションファイルがGCによって削除されてしまえば、やはりセッションは無効となります。

したがって、ログイン維持のような機能を作るには、この両方の有効期限を適切に設定する必要があるのです。

PHPスクリプトでセッションの有効期限を設定する

セッションの有効期限は、サーバー全体の設定ファイルであるphp.iniでも変更できますが、アプリケーションごとに有効期限を変えたい場合がほとんどでしょう。

その場合は、PHPスクリプト内で動的に設定するのが一般的です。

ここで最も重要なルールは、必ずsession_start()を呼び出す前に、すべての設定を完了させることです。

以下は、セッション有効期限を1週間に設定するサンプルコードです。

<?php
// --- セッションの有効期限設定 ---

// 1. ブラウザ側のクッキーの有効期限を1週間に設定
// (60秒 * 60分 * 24時間 * 7日)
$cookie_lifetime = 60 * 60 * 24 * 7; 

// 2. サーバー側のセッションファイルの有効期限を1週間に設定
// (php.iniのsession.gc_maxlifetimeを上書き)
ini_set('session.gc_maxlifetime', $cookie_lifetime);

// 3. セッションクッキーのパラメータを設定
// session_set_cookie_params(有効期限, パス, ドメイン, セキュア, HTTPのみ)
session_set_cookie_params($cookie_lifetime);

// --- セッションの開始 ---
// 必ず設定の後にsession_start()を呼び出す
session_start();

// これ以降、このセッションは1週間有効になる
$_SESSION['user_id'] = 123;

echo 'セッションを開始し、有効期限を1週間に設定しました。';
?>

上記のコードについて、以下の項目で解説していきます。

session_set_cookie_params() でクッキーの有効期限を設定

この関数は、セッションクッキーに関する様々なパラメータをまとめて設定します。

第一引数に有効期限の秒数を渡すことで、ブラウザ側の有効期限をコントロールできます。

セキュリティを高めるために、path, domain, secure, httponlyといった他のパラメータも適切に設定することが推奨されます。

ini_set() でGCの有効期限を設定

ini_set()は、PHPの設定(php.iniの内容)をスクリプト実行中に動的に変更するための関数です。

ini_set('session.gc_maxlifetime', 秒数)と記述することで、サーバー側のセッションファイルの有効期限を、クッキーの有効期限と合わせて延長します。

必ずsession_start()の前に設定する

session_start()は、HTTPリクエストに含まれるクッキー情報などを基にセッションを開始・復元する関数です。

セッションが一度開始されてしまうと、そのセッションに関する設定(クッキーの有効期限など)を変更することはできません。

そのため、有効期限に関する設定は、必ずsession_start()が呼び出される前に行う必要があります。

ログイン維持(自動ログイン)機能の実装例

これまでの知識を応用して、一般的な「ログイン状態を維持する」機能の実装例を見てみましょう。

ログインフォームに「次回から自動でログインする」といったチェックボックスを用意し、その状態に応じてセッションの有効期限を切り替えます。

<?php
// ログインフォームからPOST送信があったと仮定
$is_login_successful = true; // 実際にはDBでの認証処理
$remember_me = isset($_POST['remember_me']); // チェックボックスの状態

if ($is_login_successful) {
    // ログイン維持にチェックがある場合のみ、有効期限を延長する
    if ($remember_me) {
        // 有効期限を30日に設定
        $lifetime = 60 * 60 * 24 * 30;
        ini_set('session.gc_maxlifetime', $lifetime);
        session_set_cookie_params($lifetime);
    }
    
    // セッションを開始
    session_start();
    
    // ログイン成功時にセッションIDを再発行(セキュリティ対策)
    session_regenerate_id(true);
    
    $_SESSION['user_id'] = 1; // ログイン情報を保存
    
    // マイページへリダイレクト
    header('Location: mypage.php');
    exit;
}
?>

このように、条件に応じてsession_start()の前の設定を変えることで、柔軟なセッション管理が実現できます。

セキュリティ向上のための追加設定

セッションの有効期限を長く設定する場合、セキュリティへの配慮がより一層重要になります。

セッションIDを再発行する session_regenerate_id()

ユーザーがログインに成功した直後など、権限レベルが変化する重要なタイミングでsession_regenerate_id(true)を呼び出すことを強く推奨します。

これは、セッションIDを新しく発行し直すことで、「セッション固定化(Session Fixation)」と呼ばれる、第三者がセッションIDを推測したり盗んだりして「なりすまし」を行う攻撃を防ぐための非常に重要なセキュリティ対策です。

php.iniでの設定(参考)

アプリケーション全体でセッションの有効期限を統一したい場合は、サーバーの設定ファイルであるphp.iniを直接編集することもできます。

php.ini

; サーバー側の有効期限を1時間に設定
session.gc_maxlifetime = 3600

; ブラウザ側のクッキーの有効期限を1時間に設定
session.cookie_lifetime = 3600

この方法は、サーバー全体に影響を与えるため、変更にはサーバー管理者の権限が必要です。

通常は、前述の通りPHPスクリプト内でアプリケーションごとに設定する方が柔軟性が高く、一般的です。

まとめ

今回は、PHPのセッション有効期限について、その仕組みと具体的な設定方法を解説しました。

なお、PHPを体系的に学んだり、PHPのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。

細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。

Follow me!

PAGE TOP