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 — Bir oturumla ilişkilendirilmiş tüm veriyi yokeder
session_destroy() işlevi geçerli oturumla ilişkilendirilmiş tüm veriyi yok eder. Oturumla ilişkilendirilmiş küresel değişkenleri ve oturum çerezini tanımsız yapmaz. Oturum değişkenlerini tekrar kullanmak için session_start() çağrısı yapılmalıdır.
Bilginize: Normal koddan session_destroy() çağrısı gerekmez. Oturum verilerini yok etmek yerine $ _SESSION dizisini temizleyin.
Kullanıcı çıktısını günlüğe kaydetmek gibi bir amaçla oturumu topyekün öldürmek için oturum kimliğinin de tanımsız yapılması gerekir. Eğer oturum kimliğini yaymak için bir çerez kullanılmışsa (öntanımlı olarak böyledir), oturum çerezinin de silinmesi gerekir. Bunun için setcookie() kullanılabilir.
session.use_strict_mode
etkinleştirildiğinde, eski oturum kimliği çerezini kaldırmanız gerekmez
çünkü oturum modülü, oturum kimliği ile ilişkilendirilmiş veri olmadığında
oturum kimliği çerezini kabul etmez ve yeni oturum kimliği çerezi tanımlar.
Tüm siteler için session.use_strict_mode
yönergesinin
etkinleştirilmesi önerilir.
Anında oturum silme istenmeyen sonuçlara sebep olabilir. Eşzamanlı istekler olduğunda, diğer bağlantılarda ani oturum verisi kaybı görülebilir. Örneğin, JavaScript'ten ve/veya URL bağlantılarından gelen istekler.
Geçerli oturum modülü boş oturum kimliği çerezini kabul etmese de, oturumun anında silinmesi, istemcinin (tarayıcı) yarış durumu yan etkisi nedeniyle, gereksiz yere çok sayıda boş oturum kimliği çerezi oluşturmasına sebep olabilir.
Bunlardan kaçınmak için, silme zaman damgasını $ _SESSION dizisine atamalı ve bu zaman damgasından sonraki erişimi reddetmeli veya uygulamanızın eşzamanlı istekleri olmadığından emin olmalısınız. Bu aynı zamanda session_regenerate_id() için de geçerlidir.
Bu işlevin bağımsız değişkeni yoktur.
Örnek 1 - Bir oturumun $_SESSION ile yokedilmesi
<?php
// Oturumu ilklendirelim.
// session_name("birisim") kullanacaksanız tam sırasıdır!
session_start();
// Oturum değişkenlerinin tamamını tanımsız yapalım.
$_SESSION = array();
// Oturum öldürülmek istenirse oturum çerezinin de silinmesi gerekir.
// Dikkat: Bu sadece oturum verisini değil, oturumu da yok edecektir!
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// Son olarak oturumu yok ediyoruz.
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 found out that in order to really have the session data cleared after calling session_destroy(), you need to refresh the page. For example by calling
header('Location: '.$_SERVER['PHP_SELF']."?page=profile");
if you don't then there are still data in $_SESSION which was there before. I don't know if this is intended behavior but it's kind of confusing IMO...