Skip to content

Aralık 14, 2010

PHP Session Kullanırken Eş Zamanlı Dosya Çalıştıramama

session-keys

Merhaba arkadaşlar, bu yazımızda PHP varsayılan yapılandırması ile SESSION kullandığınızda (SESSIOIN datasını diske kaydet) eş zamanlı dosya çalıştırdığınızda bekleme sorununa değineceğiz.

Söz konusu sorun PHP varsayılan yapılandırması ile SESSION kullandığınızda gerçekleşiyor. Sebebi ise PHP bir SESSION üzerinde (aynı tarayıcı oturumu) eş zamanlı sadece bir işlem çalıştırıp eş zamanlı yazmaları engellemeye çalışıyor. Ve kullanıcı bir dosyanın yüklenmesini beklerken sayfadan herhangi bir linke tıklasa bile öncelikle yüklenmesi bitmemiş olan sayfayı bekler sonrasında tıklanan sayfaya gider.

Bunun maksimum eşzamanlı ajax isteği – Max concurrent AJAX (XmlHttpRequest) requests konusuyla alakası yoktur. Zira sıkıntı / kontrol sunucu taraflıdır. İşte tam bu noktada kafamızın karışmaması için yada sorunu tam anlamak için testleri XmlHttpRequest isteği kullanmadan yaptık.

Dosya 1 :

İlk dosyamız session ile çalışan ve içinde 30 saniye bekleme olan sıradan bir PHP kodu içeriyor.

<?php
/*
 * Session kullanım testi.
 *
 * Bu dosyayı çalıştırdığınızda page2.php 'yi de aynı sessiondan çalıştırırsanız
 * bu dosyanın çalışmasının bitmesini bekler (ortalama 30 saniye).
 *
 * @author
 * @package session_test
 */

// Türkçe karakterler için
header('Content-type: text/html; charset=utf-8');
// Oturumu başlat
session_start();
// Dosya adını bul ve değişkene ata
$filename  = pathinfo(__FILE__, PATHINFO_FILENAME);
// Session ID 'yi değişkene ata
$sessionId = session_id();
// PHP yorumlayıcısını bu satırda 30 saniye beklet
sleep(30);
?>
Bu dosya (<?php echo $filename; ?>) session etkin (<?php echo $sessionId; ?>) ve
30 saniye beklemeli olarak çalıştı.

Dosya 2 :

İkinci dosyamız yine session kullanan sıradan bir PHP kodu içeriyor.

<?php
/*
 * Session kullanım testi.
 *
 * Bu dosyayı çalıştırdığınızda page1.php çalışıyorsa onun bitmesini bekler.
 *
 * @author
 * @package session_test
 */

// Türkçe karakterler için
header('Content-type: text/html; charset=utf-8');
// Oturumu başlat
session_start();
// Dosya adını bul ve değişkene ata
$filename  = pathinfo(__FILE__, PATHINFO_FILENAME);
// Session ID 'yi değişkene ata
$sessionId = session_id();
?>
Bu dosya (<?php echo $filename; ?>) session etkin (<?php echo $sessionId; ?>)
olarak çalıştı.

Dosya 3 :

Üçümcü dosyamız ise session kullanmayan basit bir PHP kodu.

<?php
/*
 * Session kullanım testi.
 *
 * Bu dosyada session kullanılmadığından her durumda normal olarak çalışır.
 *
 * @author
 * @package session_test
 */

// Türkçe karakterler için
header('Content-type: text/html; charset=utf-8');
// Dosya adını bul ve değişkene ata
$filename = pathinfo(__FILE__, PATHINFO_FILENAME);
?>
Bu dosya (<?php echo $filename; ?>) session olmadan çalıştı.

Yukarıda kodları bulunan ve aşağıda test linkleri ile birlikte download linkide bulunan dosyaları sırasıyla çalıştırdığınızda şu sıralama ile sonuç alırsınız. İlk olarak page3.php sonrasında page1.php ve son olarak page2.php dosyası sonuç verir (tam test edebilmek için iki ve daha fazla bu sırayla dosyaları çalıştırın. Çünkü ilk çalıştırmada iki ayrı session oluşur. Testlerinizde aynı session id lerin gelmesine dikkat edin).

Çözüm Var mı ?

Yazımızın başında da söylediğimiz gibi standart ayarlar ile ve tabi ki SESSION kullanıyorsanız bu sorunu yaşarsınız.

İlk çözüm yolu : Session datalarını veritabanına kaydetmek.

İkinci çözüm yolu : Eğer işinizi görüyorsa session_write_close fonksiyonunu kullanmak. Bu fonksiyonun bazı kısıtlamaları vardır. Bunlardan ilki çağrıldıktan sonra tekrar session ataması yapamazsınız. Bir diğeri ise yorumlayıcı bu fonksiyona gelene kadar yine diğer isteği bekletir. Kod tasarımınız buna uygunsa session dan bilgiyi okuyup/yazıp kapatmaktır.

Test dosyaları: Download

Test Linkleri : Page 1, Page 2, Page 3

YORUM VE DENEYİMLERİNİZİ BEKLİYORUZ..

Sizin fikriniz nedir? Lütfen aşağıdaki formu kullanarak yorum yapın.

(gerekli)
(gerekli)