PHP でセッションタイムアウトを設定する

Subodh Poudel 2023年1月30日
  1. PHP で session_unset() および session_destroy() 関数を使用してセッションタイムアウトを設定する
  2. PHP で unset() 関数を使用してセッションタイムアウトを設定する
  3. PHP で session_regenerate_id() 関数を使用して現在のセッション ID を変更する
PHP でセッションタイムアウトを設定する

この記事では、session_unset() 関数と session_destroy() 関数を使用して PHP でセッションを破棄する方法を紹介します。30 分後にセッションを破棄します。最後のアクティビティから現在の時刻までの時間間隔をチェックして、セッションを破棄します。

また、unset() 関数を使用して PHP でセッションタイムアウトを設定する別の方法を示します。unset() 関数は、セッション変数をパラメーターとして受け取ります。このメソッドは、配列を使用してセッション変数を格納します。

session_regenerate_id() 関数を使用して現在のセッション ID を無効にする別のメソッドを紹介します。この関数は、現在のセッションの新しいセッション ID を生成し、前のセッション ID を破棄します。

PHP で session_unset() および session_destroy() 関数を使用してセッションタイムアウトを設定する

session_unset() 関数を使用して実行時に $_SESSION 変数の設定を解除し、session_destroy() 関数を使用してストレージからセッションを破棄できます。time() 関数は現在の時刻を返します。$_SESSION 変数を使用して、最後のアクティビティのタイムスタンプを保存できます。したがって、最後のアクティビティから現在の時刻までの差を計算することで、時刻を確認できます。このようにして、セッションの時間間隔をチェックします。

たとえば、session_start() 関数を使用してサーバーでセッションを開始します。isset() 関数を使用してセッションが作成されているかどうかを確認してください。&&演算子を使用して、issset() 関数内の他の条件を確認します。time() 関数からセッション変数 start を減算し、結果が 1800 より大きいかどうかを確認します。if 条件内で session_unset() および session_destroy() を使用します。次に、セッションが破棄されたことを示すメッセージを表示します。if 条件の外で、セッション変数 $_SESSION['start'] を作成し、それに time() 関数を割り当ててセッションを更新します。

以下の例ではセッション変数がまだ作成されていないため、if 条件は失敗します。条件が失敗すると、セッションが作成されます。ユーザーがサーバーにリクエストを送信しない場合、セッションは 30 分後に期限切れになります。isset() 関数の後半では、セッションの合計アクティブ時間をチェックします。1800 は 1800 秒を意味し、これは 30 分に相当します。合計アクティブ時間が 30 分を超えると、if 条件が真になります。次に、セッションを破棄します。コードの出力は、アクティブ時間の 30 分を超えた後に破棄されるセッションに対応します。session_unset() 関数の詳細については、PHP マニュアルを確認してください。

サンプルコード:

# php 7.*
<?php
session_start();
if (isset($_SESSION['start']) && (time() - $_SESSION['start'] > 1800)) {
    session_unset(); 
    session_destroy(); 
    echo "session destroyed"; 
}
$_SESSION['start'] = time();
?>

出力:

session destroyed

PHP で unset() 関数を使用してセッションタイムアウトを設定する

unset() 関数を使用して、PHP の特定のセッション変数のセッションを破棄できます。この関数は、パラメーターとして $_SESSION 変数を取ります。このメソッドは、セッションを配列に格納します。連想配列を使用して、セッション名とセッション開始時刻を格納できます。time() 関数を使用して現在の時刻を取得できます。上記の方法でセッション時間間隔を確認し、現在の時間からアクティブなセッション時間を差し引くことができます。

たとえば、session_start() 関数を使用してセッションを開始します。セッション変数 $_SESSION['start'] を記述し、それに連想配列を割り当てます。キー0registered を書き込み、それぞれのキーの値 activetime() を書き込みます。時間間隔が 30 分を超えていないか確認してください。条件が真の場合は、パラメーターとして $_SESSION['start'] を指定して unset() 関数を記述します。次に、session destroyed というメッセージを表示します。if 条件ブロックの外側で、セッション変数 $_SESSION['start']time() 関数で更新します。

以下の例では、配列にセッション変数が含まれています。セッション変数の値は active です。time() 関数は配列に現在のタイムスタンプを作成し、キーregistered は値を保持します。$_SESSION スーパーグローバル変数の詳細については、PHP マニュアルを確認してください。

サンプルコード:

#php 7.x
<?php
session_start();
$_SESSION['start'] = array(0=> 'active', 'registered' => time())
if ((time() - $_SESSION['start']['registered']) > (60 * 30)) {
    unset($_SESSION['start']);
    echo "session destroyed";
}
$_SESSION['start'] = time();
?>

出力:

session destroyed

PHP で session_regenerate_id() 関数を使用して現在のセッション ID を変更する

session_regenerate_id() 関数を使用して、現在のセッションのセッション ID を変更できます。このようにして、スクリプトがセッション固定されないようにすることができます。関数のブール値 true は、新しいセッション ID の生成を有効にします。このメソッドでは、セッション ID の再生成の前後に、session_id() 関数を使用してセッション ID を出力できます。ただし、セッション ID を変更してもセッションは期限切れになりません。ユーザーに再度ログインするように要求するだけです。したがって、セッション固定を防ぎます。

たとえば、session_id() 関数を使用してセッションを開始します。session_id() 関数を使用して現在のセッション ID を表示します。セッションが作成されているかどうかを確認し、セッション $_SESSION['start'] を作成して、time() 関数を割り当てます。上記の方法で行ったように、アクティブなセッションの時間間隔を見つけます。条件が true の場合は、session_regenerate_id(true) 関数を使用します。セッション変数を更新します。スクリプトの最後に、session_id() 関数を使用して新しいセッション ID を出力します。

サンプルコード:

#php 7.x
<?php
session_start();
print("Old: ".session_id());
echo "<br>";
if (!isset($_SESSION['start'])) {
    $_SESSION['start'] = time();
} else if (time() - $_SESSION['start'] > 1800) {
    session_regenerate_id(true); 
    $_SESSION['start'] = time(); 
}
print("Now: ".session_id());
?>

出力:

​Old: t38kssej37un38mtsoa6lovh05 
Now: mak7i3in708c6rl2udd8gbfo3r ​ ​
著者: Subodh Poudel
Subodh Poudel avatar Subodh Poudel avatar

Subodh is a proactive software engineer, specialized in fintech industry and a writer who loves to express his software development learnings and set of skills through blogs and articles.

LinkedIn

関連記事 - PHP Session