25 Eylül 2007 Salı

PHP ile Oturum (Session) Fonksiyonları

Merhaba Webkolog takipçileri!

Web sitelerinde kullanıcı deneyimini zenginleştirmek için bazen sadece bir sayfalık bilgilere değil, kullanıcının site üzerindeki gezintisi boyunca "hatırlanması" gereken verilere ihtiyaç duyarız. Örneğin, bir alışveriş sepeti, kullanıcı girişi durumu veya dil seçimi gibi bilgiler. İşte tam bu noktada **oturumlar (sessions)** devreye giriyor! PHP oturumları, her kullanıcı için sunucu tarafında geçici veri depolama imkanı sunar ve bu verilerin farklı sayfa istekleri arasında korunmasını sağlar. Bu makalede, PHP'nin oturum fonksiyonlarının gücünü keşfedeceğiz. Hadi gelin, kullanıcılarınızı sitenizde nasıl "hatırlayacağımıza" bakalım!


1. Oturum Başlatma ve Veri Saklama

Oturum kullanmanın ilk adımı onu başlatmaktır. Ardından, $_SESSION süperglobal dizisini kullanarak kolayca veri saklayabiliriz.


<?php
// Oturumu başlatır veya daha önce başlatılmış bir oturumdaki değişkenlerin kullanılmasını sağlar: session_start()
// Bu fonksiyon, HTML çıktısından önce çağrılmalıdır!
session_start();

// Oturum değişkenlerine veri atama
$_SESSION['kullanici_adi'] = "WebkologZiyaretcisi";
$_SESSION['favori_renk'] = "mavi";
$_SESSION['giris_zamani'] = time();

echo "Oturum başlatıldı ve veriler kaydedildi.<br>";
echo "Kullanıcı Adı: " . $_SESSION['kullanici_adi'] . "<br>";
echo "Favori Renk: " . $_SESSION['favori_renk'] . "<br>";
echo "Giriş Zamanı: " . date('Y-m-d H:i:s', $_SESSION['giris_zamani']) . "<br>";

// Oturumun numarasını verir: session_id()
echo "Oturum ID: " . session_id() . "<br>";

// Oturumun adını verir: session_name() (varsayılan: PHPSESSID)
echo "Oturum Adı: " . session_name() . "<br>";
?>

2. Oturum Değişkenlerini Yönetme (Eski Yöntemler ve Güncel Yaklaşım)

PHP'nin eski versiyonlarında (5.2 dahil), oturum değişkenlerini kaydetmek ve kaldırmak için session_register() ve session_unregister() gibi fonksiyonlar vardı. Ancak bu fonksiyonlar, $_SESSION süperglobal dizisinin kullanıma girmesiyle birlikte PHP 5.3.0'dan itibaren kullanımdan kaldırılmıştır (deprecated). Bu yüzden, modern PHP uygulamalarında bu fonksiyonlar yerine doğrudan $_SESSION dizisiyle çalışmak en doğru ve güvenli yaklaşımdır. Yine de, eski versiyonları anlamanız için örneklerini vereceğim.


<?php
session_start();

// Eski Yöntem: session_register() - PHP 5.3.0'dan itibaren kullanımdan kaldırıldı
// Eğer PHP 5.2 veya altı bir sürüm kullanıyorsanız bu çalışır.
// $urun_id = 123;
// session_register("urun_id"); // $urun_id değişkenini oturuma kaydeder
// $_SESSION['urun_id'] = $urun_id; // Yeni ve tercih edilen yöntem

// Eski Yöntem: session_is_registered() - PHP 5.3.0'dan itibaren kullanımdan kaldırıldı
// if (session_is_registered("urun_id")) {
//     echo "Urun ID oturuma kayıtlı (eski yöntem).<br>";
// }

// Yeni ve tercih edilen yöntemle kontrol: isset($_SESSION['degisken_adi'])
if (isset($_SESSION['kullanici_adi'])) {
    echo "Kullanıcı adı oturumda mevcut (yeni yöntem).<br>";
}

// Oturum değişkenini kaldırmak: session_unset() veya unset($_SESSION['degisken'])
// session_unset(): Tüm oturum değişkenlerini temizler.
// unset($_SESSION['degisken_adi']): Belirli bir oturum değişkenini kaldırır.

// Tek bir oturum değişkenini silmek:
unset($_SESSION['favori_renk']);
if (!isset($_SESSION['favori_renk'])) {
    echo "Favori renk oturumdan kaldırıldı.<br>";
}

// Tüm oturum değişkenlerini silmek: session_unset()
// $_SESSION = array(); // Bu da tüm değişkenleri temizlemenin bir yoludur.
session_unset();
if (empty($_SESSION)) {
    echo "Tüm oturum değişkenleri temizlendi (session_unset).<br>";
}
?>

3. Oturum Verilerini Kodlama ve Çözme

Oturum verilerini bir stringe dönüştürmek (encode) veya bir stringden geri yüklemek (decode) bazen özel depolama senaryolarında faydalı olabilir.


<?php
session_start();

$_SESSION['test_veri'] = array("sayi" => 42, "isim" => "Deneme");

// Mevcut oturumdaki bilgileri kodlayarak bir yazı (string) oluşturur: session_encode()
$encoded_data = session_encode();
echo "Kodlanmış oturum verisi: " . htmlspecialchars($encoded_data) . "<br>";
// Çıktı örneği: test_veri|a:2:{s:4:"sayi";i:42;s:4:"isim";s:6:"Deneme";}

// Oturumdaki mevcut değişkenleri temizleyelim
session_unset();
echo "Oturum değişkenleri temizlendi.<br>";
if (!isset($_SESSION['test_veri'])) {
    echo "Test veri artık oturumda değil.<br>";
}

// Kodlanmış bilgilerin çözülmesini (decode edilmesini) sağlar: session_decode()
// Bu fonksiyon, verilen stringi alıp $_SESSION dizisini yeniden doldurur.
if (session_decode($encoded_data)) {
    echo "Kodlanmış veri başarıyla çözüldü.<br>";
    echo "Çözülen test_veri['sayi']: " . $_SESSION['test_veri']['sayi'] . "<br>";
    echo "Çözülen test_veri['isim']: " . $_SESSION['test_veri']['isim'] . "<br>";
} else {
    echo "Kod çözme başarısız.<br>";
}
?>

4. Oturum ID'sini ve Parametrelerini Yönetme

Oturum ID'sini değiştirmek veya oturum çerezinin davranışını ayarlamak, güvenlik ve oturum yönetimi için önemlidir.


<?php
session_start();

// Oturum ID'sini yeniden üretir, mevcut oturum bilgileri değişmez: session_regenerate_id()
echo "Eski Oturum ID: " . session_id() . "<br>";
session_regenerate_id();
echo "Yeni Oturum ID: " . session_id() . "<br>";
// Not: session_regenerate_id() varsayılan olarak eski oturum dosyasını siler.

// Oturumun çerez parametrelerini oluşturur/ayaralar: session_set_cookie_params()
// (yaşam süresi, yol, alan, güvenli, http-only)
// Bu fonksiyon session_start()'tan önce çağrılmalıdır!
// session_set_cookie_params(3600, "/", ".example.com", false, true); // 1 saat geçerli, tüm alan adları için

// Mevcut oturum çerezindeki bilgilerle bir dizi oluşturur: session_get_cookie_params()
$cookie_params = session_get_cookie_params();
echo "<h5>Oturum Çerez Parametreleri:</h5>";
echo "<pre>";
print_r($cookie_params);
echo "</pre>";
/* Çıktı Örneği:
Array
(
    [lifetime] => 0
    [path] => /
    [domain] =>
    [secure] =>
    [httponly] =>
)
*/
?>

5. Oturum Sonlandırma ve Ayarlar

Bir oturumu tamamen sonlandırmak ve oturum dosyalarının kaydedildiği yolu veya önbellek ayarlarını yönetmek mümkündür.


<?php
session_start();
$_SESSION['test'] = "Bu bir test verisi.";

// Oturum bilgilerini yazar ve oturumu sonlandırır: session_write_close() veya session_commit()
// Bu, özellikle AJAX istekleri gibi durumlarda, oturum kilitlenmesini serbest bırakmak için faydalıdır.
session_write_close();
echo "Oturum yazıldı ve kapatıldı. Artık bu betikte oturum değişkenlerine erişemezsiniz (yeniden başlatana kadar).<br>";
// echo $_SESSION['test']; // Bu satır hata verecektir çünkü oturum kapatıldı.

// session_commit() fonksiyonu session_write_close() fonksiyonunun takma adıdır.
// session_commit(); // Aynı etki

// O anki oturumda bulunan bütün bilgileri siler (oturum dosyasını siler): session_destroy()
// Ancak $_SESSION dizisindeki değişkenleri veya çerez bilgilerini etkilemez.
// Yani $_SESSION dizisini de boşaltmanız veya çerezi de silmeniz gerekir.
session_destroy();
echo "Oturum dosyası sunucudan silindi.<br>";
// Oturum sonlandırıldıktan sonra, $_SESSION dizisini de temizlemek iyi bir pratiktir.
$_SESSION = array(); // Tüm oturum değişkenlerini temizle

// Oturum çerezini de silmek için (tarayıcıdan)
if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time() - 42000, '/');
    echo "Oturum çerezi de silindi.<br>";
}

echo "<hr>";

// O anki oturumun kaydedildiği dizinin adını verir/düzenler/değiştirir: session_save_path()
// session_save_path('/tmp'); // Bu satır session_start()'tan önce çağrılmalıdır.
echo "Oturum Kayıt Yolu: " . session_save_path() . "<br>";

// O anki aktif oturum modülünün adını verir ve düzenler/değiştirir: session_module_name()
echo "Oturum Modülü Adı: " . session_module_name() . "<br>"; // Çoğunlukla "files"

// Tampon belleğe alınmış oturumlar için dakika olarak kullanım süresini belirtir: session_cache_expire()
// Dönüş değeri dakika cinsindendir.
echo "Oturum Önbellek Süresi: " . session_cache_expire() . " dakika.<br>";

// O anki tampon bellek sınırlayıcının durumunu belirtir veya değiştirir: session_cache_limiter()
echo "Oturum Önbellek Sınırlayıcısı: " . session_cache_limiter() . "<br>"; // Örnek: "nocache" veya "private"
?>

Önemli Notlar ve Güvenlik İpuçları

  • Her PHP sayfasının başında, HTML çıktısı göndermeden önce session_start() fonksiyonunu çağırmalısınız.
  • Oturum ID'sinin çalınmasını (session hijacking) önlemek için session_regenerate_id() fonksiyonunu, özellikle kullanıcı girişinden sonra veya belirli aralıklarla kullanmak iyi bir güvenlik pratiğidir.
  • Hassas bilgileri doğrudan oturumda saklamaktan kaçının. Eğer saklamanız gerekiyorsa, bu verileri şifrelemeyi düşünün.
  • Oturum çerezlerinin güvenliğini artırmak için session_set_cookie_params() fonksiyonunu kullanarak `secure` ve `httponly` parametrelerini `true` olarak ayarlayın. Ancak bunun için HTTPS kullanmanız gerekir.

PHP oturum fonksiyonları, web uygulamalarınızda kullanıcıların durumlarını korumanız ve daha kişiselleştirilmiş deneyimler sunmanız için vazgeçilmezdir. Bu fonksiyonları doğru bir şekilde kullanarak, alışveriş sepetlerinden üye giriş sistemlerine kadar birçok farklı özelliği kolayca hayata geçirebilirsiniz. Unutmayın, oturum yönetimi aynı zamanda bir güvenlik konusudur, bu yüzden doğru pratikleri uygulamak çok önemlidir!

Webkolog'u takipte kalın!

Hepinize bol kodlu ve başarılı projeler dilerim!

0 yorum:

Yorum Gönder