If you want to change the session id on each log in, make sure to use session_regenerate_id(true) during the log in process.
<?php
session_start();
session_regenerate_id(true);
?>
[Edited by moderator (googleguy at php dot net)]
(PHP 4, PHP 5, PHP 7, PHP 8)
session_destroy — セッションに登録されたデータを全て破棄する
session_destroy()は、現在のセッションに 関連づけられたすべてのデータを破棄します。この関数は、 セッションに関するグローバル変数を破棄しません。 また、セッションクッキーを破棄しません。 セッション変数の利用を再開するには session_start() をコールする必要があります。
注意: 通常のコードでは、session_destroy() を呼ぶ必要はありません。 セッションデータを破棄するよりも、 $_SESSION 配列をクリーンアップしてください。
セッションを切断するには、 セッション ID の割り当ても解除する必要があります。セッション ID の受け渡しに クッキーが使用されている場合(デフォルト)には、セッションクッキーも 削除されなければなりません。 そのために setcookie() が利用できます。
session.use_strict_mode が有効になっている場合、 古くなった セッションID のクッキーを削除する必要はありません。 なぜなら、セッションモジュールはセッションIDに紐付いたデータがないとき、 セッションID のクッキーを受け入れないからです。 全てのサイトで、 session.use_strict_mode を有効にすることを推奨します。
すぐにセッションを削除してしまうと、 望まない結果が起こる可能性があります。 並列にリクエストが行われたときに、 他のリクエストの接続は突然データが消えたように見えるかもしれません。 たとえば、JavaScript または/もしくは URLリンクからのリクエストが同時に実行された場合です。
現在のセッションモジュールは、空のセッションIDを受け入れません。 しかし、すぐにセッションを削除してしまうと、 クライアント(ブラウザ)サイドとの競合によって、 空のセッションIDクッキーが発生するかもしれません。 これにより、不必要なのにクライアント側が たくさんのセッションIDを作ってしまうことになります。
こうした事象を防ぐためには、 $_SESSION に削除時のタイムスタンプを設定し、 それより後のアクセスを拒否するようにしなければなりません。 もしくは、アプリケーションが同時に 複数のリクエストを受け付けないようにすることです。 同じことは、session_regenerate_id() 関数にも当てはまります。
この関数にはパラメータはありません。
成功した場合に true
を、失敗した場合に false
を返します。
例1 $_SESSIONでセッションを破棄する
<?php
// セッションの初期化
// session_name("something")を使用している場合は特にこれを忘れないように!
session_start();
// セッション変数を全て解除する
$_SESSION = array();
// セッションを切断するにはセッションクッキーも削除する。
// Note: セッション情報だけでなくセッションを破壊する。
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// 最終的に、セッションを破壊する
session_destroy();
?>
If you want to change the session id on each log in, make sure to use session_regenerate_id(true) during the log in process.
<?php
session_start();
session_regenerate_id(true);
?>
[Edited by moderator (googleguy at php dot net)]
It took me a while to figure out how to destroy a particular session in php. Note I'm not sure if solution provided below is perfect but it seems work for me. Please feel free to post any easier way to destroy a particular session. Because it's quite useful for functionality of force an user offline.
1. If you're using db or memcached to manage session, you can always delete that session entry directly from db or memcached.
2. Using generic php session methods to delete a particular session(by session id).
<?php
$session_id_to_destroy = 'nill2if998vhplq9f3pj08vjb1';
// 1. commit session if it's started.
if (session_id()) {
session_commit();
}
// 2. store current session id
session_start();
$current_session_id = session_id();
session_commit();
// 3. hijack then destroy session specified.
session_id($session_id_to_destroy);
session_start();
session_destroy();
session_commit();
// 4. restore current session id. If don't restore it, your current session will refer to the session you just destroyed!
session_id($current_session_id);
session_start();
session_commit();
?>
I'm using PHP 7.1 and received the following warning when implementing Example #1, above:
PHP message: PHP Warning: session_destroy(): Trying to destroy uninitialized session in...
What I discovered is that clearing $_SESSION and removing the cookie destroys the session, hence the warning. To avoid the warning while still keeping the value of using session_destroy(), do this after everything else:
if (session_status() == PHP_SESSION_ACTIVE) { session_destroy(); }
All of a sudden neither session_destroy() nor $_SESSION=[] were sufficient to log out. I found the next to work:
<?php
setcookie(session_name(), session_id(), 1); // to expire the session
$_SESSION = [];
?>