2 Ekim 2026 - 10:14
PHP'de Girişten Sonra Oturum Neden Kaybolur? Görseli
PHP

PHP'de Girişten Sonra Oturum Neden Kaybolur?

Yorumlar

Kullanıcı adı ve parola kabul ediliyor, panel sayfasına yönlendirme yapılıyor, fakat panel yeniden giriş istiyor. Bu durumda ilk yapılacak iş parola sorgusunu değiştirmek değildir. Giriş isteği ile panel isteğinin aynı oturumu okuyup okumadığını bulmak gerekir. Tarayıcı çerezi taşıyor mu, PHP doğru oturumu açıyor mu, sunucu yazdığı veriyi sonraki istekte okuyabiliyor mu? Bu üç aşamayı ayrı kontrol edince sorun daralır.

Buradaki tanı dosyaları PHP 8 sözdizimini kullanır. Kodlar giriş sisteminden bağımsızdır; gerçek kullanıcı veya parola içermez. Denemeyi yerel ortamda ya da erişimi kısıtlı bir test dizininde yapın. Oturum kimliklerini hata kaydına, ekran görüntüsüne veya destek talebine eklemeyin.

Önce uygulamadan bağımsız iki dosyayla deneyin

Aşağıdaki dosyaları aynı dizine koyun. İlk dosya bir sayaç artırır, oturum verisini yazar ve ikinci dosyaya gider. Yönlendirme öncesindeki session_write_close(), veriyi oturum deposuna yazıp kilidi bırakır. Böylece uygulamadaki form, kullanıcı sorgusu ve yetki kontrolünü testin dışına almış oluruz.

oturum-yaz.php:

PHP
<?php
declare(strict_types=1);
ini_set('session.use_strict_mode', '1');
ini_set('session.use_only_cookies', '1');
session_name('NETOPSIYON_TEST');
if (!session_start()) {
    http_response_code(500);
    exit('Oturum baslatilamadi; sunucu logunu kontrol edin.');
}
$_SESSION['deneme'] = (int) ($_SESSION['deneme'] ?? 0) + 1;
session_write_close();
header('Location: oturum-oku.php', true, 303);
exit;

oturum-oku.php:

PHP
<?php
declare(strict_types=1);
ini_set('session.use_strict_mode', '1');
ini_set('session.use_only_cookies', '1');
session_name('NETOPSIYON_TEST');
if (!session_start()) {
    http_response_code(500);
    exit('Oturum baslatilamadi.');
}
$sayac = $_SESSION['deneme'] ?? null;
session_write_close();
header('Content-Type: text/plain; charset=UTF-8');
header('Cache-Control: no-store');
echo $sayac === null ? 'Oturum verisi yok' : 'Sayac: ' . $sayac;

İlk dosyayı tarayıcıda açın. İlk ziyaretin beklenen çıktısı Sayac: 1; yeniden ilk dosyaya giderseniz Sayac: 2 olur. Yalnızca okuma sayfasını yenilemek sayacı artırmaz. Bu test çalışıyor ama giriş sistemi çalışmıyorsa sorun büyük olasılıkla uygulamanın başlatma sırası, oturum adları veya giriş kontrolüdür. Test de başarısızsa aşağıdaki çerez ve depolama ayrımına geçin.

Network panelinde iki isteği yan yana okuyun

Geliştirici araçlarında Network panelini açıp “Preserve log” seçeneğini etkinleştirin. Yeni bir özel pencerede testi başlatın. İlk yanıtın Set-Cookie başlığıyla oluşturduğu oturum çerezi, ikinci isteğin Cookie başlığında gönderilmelidir. Daha önce oluşmuş geçerli bir çerez varsa her yanıtta yeniden Set-Cookie görmeniz gerekmez.

GözlemÖnce kontrol edilecek yer
Çerez yanıtla geliyor ama tarayıcı saklamıyorTarayıcının engelleme gerekçesi, Secure, Domain ve SameSite ayarları
Çerez saklanıyor ama panel isteğinde yokHTTP/HTTPS, www farkı, alt alan adı ve Path kapsamı
Çerez aynı fakat oturum verisi boşsession.save_path, depo hataları, uygulamanın session temizleyen kodu
İstekler arasında yeni oturumlar oluşuyorFarklı session_name, sürekli kimlik yenileme, farklı sunuculara dağıtım

Örneğin giriş www.example.com, panel example.com üzerinde çalışıyorsa host kapsamındaki çerez taşınmayabilir. Önce tek bir kanonik adres seçip girişten önce oraya yönlendirin. Sorunu çözmek için çerezi bütün alt alan adlarına açmak gereksiz bir kapsam genişlemesine yol açabilir.

Ortak başlatma dosyası kullanın

HTTPS üzerinde çalışan uygulamada bütün uçların aynı bootstrap.php dosyasını yüklemesi ayar farklarını azaltır. Dosya herhangi bir HTML, boşluk veya BOM çıktısından önce çağrılmalıdır. Saf PHP dosyalarında kapanış etiketini kullanmamak, dosya sonundaki istemsiz çıktıyı önler.

PHP
<?php
declare(strict_types=1);
ini_set('session.use_strict_mode', '1');
ini_set('session.use_only_cookies', '1');
session_name('APPSESSID');
session_set_cookie_params([
    'lifetime' => 0,
    'path' => '/',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);
if (!session_start()) {
    throw new RuntimeException('Oturum deposu kullanilamiyor.');
}

secure=true HTTPS dağıtımı içindir. Yerel düz HTTP testinde tarayıcı davranışına güvenerek bu yapılandırmayı kopyalamayın; yerel HTTPS kurun veya yalnızca geliştirme yapılandırmasında değeri değiştirin. Ters proxy kullanıyorsanız dış adresin HTTPS olmasını dağıtım ayarıyla belirleyin. İstemcinin gönderebildiği rastgele X-Forwarded-Proto başlığına güvenerek güvenlik ayarı türetmeyin.

Çerez sağlamsa sunucu tarafını inceleyin

Web isteğinin kullandığı PHP-FPM havuzu ile terminaldeki PHP farklı yapılandırmalar yükleyebilir. Bu nedenle yalnızca php -i çıktısıyla karar vermeyin. Erişimi kısıtlı tanı ekranında ini_get('session.save_handler') ve ini_get('session.save_path') değerlerini kontrol edin. Dosya deposunda PHP kullanıcısının dizine yazabildiğini, disk ve inode sınırlarını; Redis gibi depolarda bağlantı ve süre aşımı kayıtlarını inceleyin. Yetki sorununu chmod 777 ile geçiştirmeyin.

Yük dengeleyicinin arkasındaki iki makine ayrı yerel oturum dosyaları kullanıyorsa bir istekte var olan veri diğerinde bulunmayabilir. Ortak oturum deposu kurmak veya mimariye uygun oturum yönlendirmesi kullanmak gerekir. Bu durumu teşhis ederken kayıtlarınıza oturum sırrını değil, isteği işleyen sunucu adını ve ilişkilendirme numarasını yazın.

Girişten önce oluşturulan oturumu giriş anında yenilemek ile her sayfada kimlik yenilemek aynı iş değildir. Özellikle paralel AJAX isteklerinde eski oturumun hemen silinmesi yarış durumuna yol açabilir. Kimlik yenileme sırasını PHP kılavuzundaki eşzamanlı istek uyarısıyla birlikte değerlendirin.

Başvuru: PHP oturum ayarları ve oturum kimliği yenileme. Kalıcı giriş gerekiyorsa beni hatırla akışını, çıkıştan sonra oturum yeniden açılıyorsa çıkış ve token iptalini inceleyin.

Düzeltmeyi aynı iki istekle doğrulayın

Çerezleri temizleyip yazma dosyasını iki kez açın: sayaç 1 ve ardından 2 olmalı. Ardından gerçek uygulamada giriş yapıp korunan bir sayfaya gidin; aynı işlem yeni bir özel pencerede giriş yapmadan reddedilmelidir. Test başarılı olduğunda iki tanı dosyasını sunucudan kaldırın. Sorun yalnızca yük altında dönüyorsa sıradaki kontrol oturum deposunun eşzamanlı erişim davranışıdır.

Benzer Yazılar

Yorumlar ()

Henüz yorum yok. İlk yorum yapan sen ol!

Yorum Yap