BurtiNETBlog
PHP

CodeIgniter PHP Session Hatası Düzeltme (Kesin Çözüm)

Mertcan Selek4 dk okuma
CodeIgniter PHP Session Hatası Düzeltme (Kesin Çözüm)
İçindekiler

CodeIgniter ile geliştirdiğiniz bir siteyi hosting'e yüklediğinizde bazen oturum (session) hiç başlamaz, kullanıcılar sürekli çıkış yapmış gibi görünür ya da ekranda doğrudan bir session hatası çıkar. Bu, özellikle paylaşımlı (shared) hosting ortamlarında CodeIgniter kullanan geliştiricilerin sık karşılaştığı, ama kaynağı anlaşılınca dakikalar içinde çözülebilen bir sorundur.

CodeIgniter Session Hatası Neden Oluşur?

PHP'nin session mekanizması, oturum verilerini varsayılan olarak sunucudaki bir dosya sistemi yoluna (session.save_path) yazar. CodeIgniter de bu davranışı sess_save_path (CodeIgniter 3) ya da sessionSavePath (CodeIgniter 4) ayarıyla yönetir. Hata genelde şu üç nedenden birinden kaynaklanır:

  • Belirtilen dizin mevcut değil — config dosyasında yazan yol, sunucuda gerçekten yoktur.
  • Belirtilen dizin yazılabilir (writable) değil — dizin var ama PHP'nin çalıştığı kullanıcı (genelde www-data veya cPanel kullanıcı hesabı) o dizine yazma izni bulamaz.
  • open_basedir kısıtlaması — hosting sağlayıcısı güvenlik amacıyla PHP'nin yalnızca kendi hesap dizininizin içine erişebilmesini zorunlu kılmıştır; sys_get_temp_dir() gibi hesap dışı bir yol bu durumda erişilemez olabilir.

Tarayıcıda ya da PHP hata loglarında genelde şuna benzer bir mesaj görürsünüz:

session_start(): Failed to read session data: user (path: /var/lib/php/sessions)
Severity: warning -- SessionHandler::write(): open(...) failed: No such file or directory

Hızlı Çözüm: Geçici Dizine Yönlendirme

En hızlı (ama kalıcı olmayan) çözüm, session yolunu sunucunun sistem geçici dizinine yönlendirmektir. CodeIgniter 3 için application/config/config.php dosyasını açın ve şu satırı bulun:

$config['sess_save_path'] = NULL;

Bu satırı silip yerine şunu ekleyin:

$config['sess_save_path'] = sys_get_temp_dir();

Dosyayı kaydedip siteyi yenileyin. Çoğu durumda hata anında ortadan kalkar çünkü sistem geçici dizini PHP tarafından her zaman yazılabilir durumdadır.

Kalıcı ve Daha Güvenli Çözüm: Kendi Session Klasörünüzü Oluşturun

Sistem geçici dizini paylaşımlı hosting'lerde diğer hesaplarla ortak olabilir ve sunucu tarafından periyodik temizlenebilir — bu da beklenmedik oturum kopmalarına yol açabilir. Production bir site için önerilen yöntem, kendi hesabınız içinde ayrı bir session klasörü oluşturmaktır:

  1. cPanel/DirectAdmin dosya yöneticisinden veya FTP ile, genel erişime kapalı bir konumda (ör. public_html dışında) bir sessions klasörü oluşturun.
  2. Klasöre 755 (bazı sunucularda 775) izni verin.
  3. Config dosyasında tam sunucu yolunu (absolute path) belirtin:
$config['sess_save_path'] = '/home/kullaniciadi/sessions';

CodeIgniter 4 kullanıyorsanız ayar dosyası ve değişken adı farklıdır — app/Config/App.php içinde:

public string $sessionSavePath = WRITEPATH . 'session';

CI4'te varsayılan olarak writable/session klasörü zaten bu iş için ayrılmıştır; hata alıyorsanız önce bu klasörün gerçekten yazılabilir olduğunu kontrol edin.

Alternatif: Veritabanı Tabanlı Session Kullanmak

Dosya izinleriyle sürekli uğraşmak istemiyorsanız ya da siteniz birden fazla sunucuda (load balancer arkasında) çalışıyorsa, session'ları dosya yerine veritabanında tutmak daha sağlam bir çözümdür:

$config['sess_driver'] = 'database';
$config['sess_save_path'] = 'ci_sessions';

Bu ayarla birlikte CodeIgniter'ın dokümantasyonunda verilen ci_sessions tablosunu veritabanınızda oluşturmanız gerekir. Dosya sistemi izin sorunlarının hiçbirini yaşamazsınız, ancak her session işlemi bir veritabanı sorgusuna dönüştüğü için çok yüksek trafikli sitelerde performansı biraz izlemekte fayda var.

Değişiklik Sonrası Hâlâ Hata Alıyorsanız

  • open_basedir kısıtlamasını kontrol edin: Hosting panelinizden veya bir phpinfo() çıktısından open_basedir değerine bakın; belirttiğiniz session yolu bu listenin dışındaysa PHP erişemez.
  • Dosya sahipliğini kontrol edin: Klasör başka bir kullanıcıya (ör. root) aitse, PHP-FPM'in çalıştığı kullanıcı izinli olsa bile yazamayabilir; chown ile doğru sahipliğe geçirin.
  • PHP sürümünüzü kontrol edin: Çok eski bir CodeIgniter sürümü (özellikle CI 2.x) güncel PHP sürümleriyle (8.x) session yönetiminde uyumsuzluk çıkarabilir; mümkünse CodeIgniter'ı güncelleyin.
  • Hata loglarına bakın: cPanel'de "Errors" aracı veya sunucu error_log dosyası, tam olarak hangi yola yazılamadığını gösterir — tahmin yürütmek yerine buradan başlayın.

Sık Sorulan Sorular

sys_get_temp_dir() kullanmak güvenli mi?

Test ortamı veya küçük bir site için sorun yaratmaz, ancak paylaşımlı hosting'de bu dizin diğer hesaplarla ortak olabilir ve sunucu tarafından periyodik temizlenir. Production bir site için kendi hesabınıza ait ayrı bir session klasörü kullanmanız önerilir.

CodeIgniter 3 ile CodeIgniter 4'te session ayarı farklı mı?

Evet. CI3'te application/config/config.php içinde $config['sess_save_path'], CI4'te ise app/Config/App.php içinde $sessionSavePath değişkeni kullanılır. Hangi sürümde olduğunuzu system/core/CodeIgniter.php dosyasındaki sürüm numarasından teyit edebilirsiniz.

Session klasörüne hangi izni vermeliyim?

Çoğu paylaşımlı hosting ortamında 755 yeterlidir. PHP hâlâ yazamıyorsa ve sunucu PHP-FPM ile farklı bir kullanıcı altında çalışıyorsa 775'e çıkarmayı deneyin; 777 gibi herkese tam yetki veren izinlerden güvenlik nedeniyle kaçının.

Hata sadece bazı sayfalarda mı çıkıyor?

Session başlatma genelde her sayfa yüklemesinde tetiklendiği için hata tipik olarak tüm sayfalarda görülür. Sadece belirli sayfalarda çıkıyorsa, o sayfaların session'ı farklı bir noktada (ör. bir kütüphane veya üçüncü parti eklenti içinde) manuel başlattığından şüphelenin.

Değişiklik yaptım ama hata cache'den mi geliyor?

Session hataları PHP seviyesinde anlık oluştuğu için tarayıcı önbelleğiyle ilgisi yoktur. Değişiklik sonrası hata devam ediyorsa, bir OPcache veya PHP-FPM önbelleği aktifse sunucuyu yeniden başlatmanız (veya hosting panelinizden PHP'yi yeniden yükletmeniz) gerekebilir.

İlgili yazılar

PHP

API Nedir?

API, Application Programming Interface (Uygulama Programlama Arayüzü) teriminin kısaltmasıdır. Yazılım sistemlerinin birbiriyle iletişim kurmasını sağlayan bir arayüzdür. API’ler,…

Emre G2 dk okuma