奇妙に機能していると思われる次の基本的なログアウトスクリプトがあります。
<?php
session_start();
$_SESSION['customerState'] = array("abbr"=>"TX","full"=>"Texas");
$_SESSION['agent']['url'] = "jmarston4";
$fart = isset($_SESSION['customerState']) ? $_SESSION['customerState'] : array();
$url = isset($_SESSION['agent']['url']) ? $_SESSION['agent']['url'] : '';
$_SESSION = array();
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
echo "Fart1: ";
print_r($fart);
session_destroy();
echo "<br>Fart2: ";
print_r($fart);
session_start();
echo "<br>Fart3: ";
print_r($fart);
$_SESSION['fart'] = $fart;
echo "<br>Fart4: ";
print_r($_SESSION['fart']);
#exit;
header('Location: https://'. $_SERVER['HTTP_HOST'] . '/' .$url);
このページは、リファラー URL ($url と記載) を使用してサイトのホームページ (index.php) にリダイレクトします。これは正常に機能します。テスト用に、index.php のすべてのコードのスクリーン ショットを次に示します。
の処理を許可するexit;
と、次のように画面に出力されます。
Fart1: アレイ ( [abbr] => TX [full] => Texas )
Fart2: アレイ ( [abbr] => TX [full] => Texas )
Fart3: アレイ ( [abbr] => TX [full] => Texas )
Fart4: アレイ ( [abbr] => TX [full] => Texas )
(または視覚的に: http://imgur.com/A6WuRfx )
このスクリプト (logout.php) では、顧客のセッションから 1 つの SESSION 変数を保持し (100 以上の他の変数を手動で設定解除しないでください)、内部目的でホームページに戻すことができるようにします。これを行うために、スクリプトは次のことを行います。
- SESSION 変数 'fart' を配列に設定します
- 次に、SESSION 全体が破棄される前に、ローカル変数が SESSION 'fart' と等しくなるように設定されます。
- セッションデータが消去されます
- セッション Cookie が削除されます
- セッションが破棄される
- SESSION 'fart' が作成され、$fart 配列に戻されます
- ページはホームページにリダイレクトされます。
質問
設計上、PHP SESSIONS はこのように動作することが期待されていますか? もしそうなら、そのユーザーセッション中に収集されたセッション情報の一部を維持しながら、どうすれば本質的にセッションを破棄できますか (ログアウトの目的など)。
注: SESSION 配列を使用しているため、GET 目的で URL を渡すことはここでは適用されません。
アップデートノート:
この質問のタイトルを「PHP セッションは仕様に従って動作していますか?」から変更しました。
これはすべてスクリプト自体で機能しますが、ホームページの $_SESSION['fart'] にアクセスしようとすると、設定されません。
session_destroy()
が呼び出された後を含め、いつでもページの SESSION 変数を設定、操作、または変更できます。たとえば、次のことをしたい場合:... session_destroy()
$_SESSION['eatmyshorts'] = "こんにちは!";
echo $_SESSION['eatmyshorts']; // hello! が表示されます ....
ただし、スクリプト (ページ) が終了すると、セッションに関連するものはすべて (
$_SESSION['eatmyshorts']
この場合でも、他のページでは使用できず、無視されます。