Oturum aşırı yük - "çok fazla veri" ne

5 Cevap php

Ben db alınan bilgilerin parçalarını önbelleğe oturum dizi kullanıyorum:

$result = mysql_query('select * from table');
array_push($_SESSION['data'],new Data(mysql_fetch_assoc($result)));

Benim soru bir sınır / / bir oturumda etrafında geçti gerektiğini olabilir bilgi büyükçe bir miktar var, nedir? Bu kötü tavsiye veya önemli ölçüde performans bunu engelleyen nedir?

5 Cevap

Varsayılan olarak, $ _SESSION veriler sunucu / tmp dizininde diskte depolanır. Sürece Orada yeterli oda ve size PHP bellek limitini vurmak değildir, sen iyisin.

Kullanıcıların büyük bir sayı için AYNI olan bir sorgu önbelleğe çalışıyorsanız eğer Ancak, APC veya tek bir kullanıcıya bağlı değildir memcache gibi bir şey kullanmak isteyebilirsiniz. Aksi takdirde, sizin aslında her kullanıcı için aynı sonuç 1x önbelleğe gidiyor, ve tüm kullanıcılar arasında bir önbellek yararlanarak değil.

Ben cevabı size veri depolama ve ne kadar hızlı oraya aktarabilirsiniz nerede bağlıdır düşünüyorum.

Veri 44 MB büyük ve bir 1000BASET ağında iseniz, aslında VAR aktarmak için 1 saniye bekleyebilirsiniz. Ve 1 saniye geri aktarmak için ..

Eğer yerel bellek kullanıyorsanız, o zaman bellek sınırlı miktarda makine var.

Eğer disk kullanıyorsanız, o zaman yük / kere (Disk yavaş) tasarruf var.

Ama aynı zamanda akılda tutmak, PHP bir komut dosyası kullanmanızı sağlar bellek sınırlı miktarda vardır. Ben varsayılan ayar 8 MB olduğunu düşünüyorum.

Eğer verilerin büyük bloklar bahsediyoruz iseniz, Redis düşünün Tokyo Cabinet veya diğer anahtar / değer depoları isteyebilirsiniz. Hatta bir arkaplan arayüzü PHP aracılığıyla transfer olmadan sizin için veri / önbelleğe işlemek için.

Oturum verileri sunucu üzerinde bir dosya (veya veritabanı kaydında) saklandığı için, bu önemli değil ne kadar çok veri bunu saklamak gerekir. Ben sadece büyük nesnelere karşı tavsiye ediyorum.

Bunu bir kullanıcı başına önbellek olmadığı gibi, bunun yerine sonuçları önbelleğe APC veya memcached bakmak isteyebilirsiniz ve bunun yerine dosyaların bellek kullanır.

Oturum tefrika ve varsayılan olarak diske yazılır, böylece kullanıcılar şeylerin boyutu ve miktarına bağlı olarak yavaş olabilir. Ancak iki şey verilerin bellek depolama için memcache kullanarak gibi (tüm detaylar için http://php.net/session altında oturum kılavuzunu okuyun) değiştirilebilir. En iyisi sistemi yaşayan ve çıkan yükü ve verimi kontrol türünü mümkün olduğunca benzer bir ortamda denemek için olduğunu.

Mmm, tricky. I think you could save it in the session. The real question is: do you want that all that information serialize and unserialize every time a client make a request? I think it would be OK to save it in there if you will use all that information in every page of your website, but this is unprobable. It would be better if you save that information in a directory like /temptables/sometable/ and each file have the name of the session. You can use session_id to get it, and save and load the information in the pages you have to use with:

$info = unserialize(file_get_contents('/templatebles/sometable/'.session_id().'.ser'));

ve tasarrufu:

file_put_contents('/temptables/sometable/'.session_id().'.ser'), serialize($info));

Ama eski dosya için bu dizini temizlemek için cron iş gerekir. Bunu dosya ismi oturum alma yapmak ve geçici dosyayı silmek gerekir eğer file_exists(session_save_path().'/sess_'.$session_name) kontrol etmek için session_start() kullanarak ya da benzeri bir şey yapıyor, 'itsalive' gibi bazı değişken için sorabilirsiniz.