[PHP] セッションの設定

○セッション

保持したいデータをサーバに保存し、
受け渡しするのはセッションIDのみ。
セッションIDは、クッキーに保存される。

・セッションの開始

session_start();

詳細は↓
http://php.net/manual/ja/function.session-start.php

・セッション情報の追加、呼び出し

$_SESSION['[セッション変数名]'] = ($value)
($value = ) $_SESSION['[セッション変数名]']

・セッションの破棄

session_destroy();

※ただし、メモリ上のセッションは残ってしまう。
 実際にセッションを完全に削除するには、
 セッション変数を空にし、セッションクッキーを削除する。

詳細は↓
http://php.net/manual/ja/function.session-destroy.php

●テストプログラム

フォームに入力した値をセッション情報に保存し、
次回フォームを開いた時にテキストボックスに元々入ってるようにする。

・form_session.php : フォームのページ
---------------------------------------------------------------
<?php
session_start([
    'gc_probability'=>1,
    'gc_divisor'=>1,
    'gc_maxlifetime'=>60
]);
?>
<!DOCTYPE html>
<html><body>
<form method="POST" action="session.php">
名 前:<input type="text" name="name" value="<?=$_SESSION['name'] ?? '' ?>" /><br />
メアド:<input type="text" name="mail" value="<?=$_SESSION['mail'] ?? '' ?>" /><br />
<input type="submit" value="登録" />
</form>
</body></html>
---------------------------------------------------------------

セッションの有効期限を60秒に、
ガーベジコレクタの実行確率を1/1に設定※

クッキーの時と同様に、
条件演算子は必要。

※PHP7.0.0以降で有効。
 php.iniで”session.gc_***”を設定するのと同等。
 php.iniのセッション設定の詳細は↓
 http://php.net/manual/ja/session.configuration.php)

・session.php : POSTデータを元にセッション情報を設定する
---------------------------------------------------------------
<?php
session_start();
$_SESSION['name'] = $_POST['name'];
$_SESSION['mail'] = $_POST['mail'];
?>
<!DOCTYPE html>
<html><body>
セッションを保存しました。<br />
名 前:<?=$_SESSION['name'] ?><br />
メアド:<?=$_SESSION['mail'] ?><br />
<input type="button" onclick="location.href='form_session.php'" value="戻る">
</body></html>
---------------------------------------------------------------

●実験

最初にフォーム画面を開いた時に、
“PHPSESSID”が発行され、クッキーに保存される。

(デベロッパーツールにて確認。
Google Chromeの場合は、F12で開く。)

フォーム画面で、
 
名前とメアドを入力して「登録」を押すと、
 
session.phpにて、セッション情報が保存される。

この時のリクエストヘッダを見ると、
先ほど発行された”PHPSESSID”を渡していることがわかる。

※”PHPSESSID”は、ブラウザを閉じるまで有効。
 セッションクッキーの有効期限を
 設定する方法もあるらしいが、今回は割愛。
 方法については↓
 https://blog.dksg.jp/2009/05/php.html

で、「戻る」を押すと、

はじめからテキストボックスに、
先ほどの入力値が入っている。

それから、有効期限の60秒以上経過してから、
ブラウザを更新すると・・・

セッション情報が削除されていない。
なぜでしょう?

session.gc_divisorの説明を見ると、
http://php.net/manual/ja/session.configuration.php#ini.session.gc-divisor
ガーベジコレクションは、
リクエスト発生時に始動するとのこと。

更新した時に、リクエスト投げてるはずだけど、
同じSESSIDだとダメなんでしょうか?

試しに60秒後、別の端末からアクセスしてみて、
その後更新(F5)。

セッション情報消えてますね。
そういうことか。

ちなみにこの時のリクエストヘッダ内のSESSIDは、
変わってませんでした。
同じSESSIDでセッションが新たに作成される。
ってことなんですかね?

独習PHP 第3版

カテゴリーphp

コメントを残す

メールアドレスが公開されることはありません。