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 — Destrói todos os dados registrados em uma sessão
session_destroy() destrói todos os dados associados com a sessão atual. Ela não apaga nenhuma das variáveis globais associadas à sessão atual, nem apaga o cookie de sessão. Para usar as variáveis de sessão novamente, session_start() deve ser chamada.
Nota: Não é necessário chamar session_destroy() em um código habitual. Ao invés de destruir os dados da sessão, limpe o array $_SESSION.
Para matar a sessão completamente, o ID da sessão também deve ser apagado. Se um cookie for usado para propagar o ID da sessão (funcionamento padrão), então o cookie de sessão deve ser excluído. setcookie() pode ser usado para isso.
Quando session.use_strict_mode está habilitado, não é necessário remover o cookie de ID das sessões obsoletas porque o módulo de sessão não aceitará um cookie de ID de sessão quando não houver dados associados ao ID de sessão, e irá criar um novo cookie de ID de sessão. Habilitar session.use_strict_mode é recomendado para todos os sites.
A remoção imediata da sessão pode causar resultados indesejados. Quando há requisições concorrentes, outras conexões podem perder de forma repentina os dados da sessão, como por exemplo, requisições originadas no JavaScript e/ou requisições de links.
Embora o módulo de sessão atual não aceita um cookie de ID de sessão vazio, a remoção imediata da sessão pode resultar em um cookie de ID de sessão vazio por causa da condição de corrida no navegador do usuário. Isso fará com que o usuário crie vários IDs de sessão desnecessariamente.
Para evitar isso, deve ser definido um timestamp de removação em $_SESSION e o acesso à sessão deve ser rejeitado algum tempo depois. Ou então a aplicação não pode ter requisições concorrentes. Isso se aplica à session_regenerate_id() também.
Esta função não possui parâmetros.
Retorna true
em caso de sucesso ou false
em caso de falha.
Exemplo #1 Destruindo uma sessão com $_SESSION
<?php
// Inicializa a sessão.
// Se estiver sendo usado session_name("something"), não esqueça de usá-lo agora!
session_start();
// Apaga todas as variáveis da sessão
$_SESSION = array();
// Se é preciso matar a sessão, então os cookies de sessão também devem ser apagados.
// Nota: Isto destruirá a sessão, e não apenas os dados!
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// Por último, destrói a sessão
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 = [];
?>