PHP: $ _SESSION içinde 'nesneler' saklanması

6 Cevap php

Ben sadece başka bir sayfaya atlamak zaman benim hala nesne var çünkü aslında store objects in the $_SESSION ve ben oldukça serin bulabilirsiniz anladım. Ben bu yaklaşımı kullanmaya başlamadan önce Şimdi ben gerçekten iyi bir fikir ya da varsa potential pitfalls dahil olmadığını öğrenmek istiyorum.

'Ben tek bir giriş noktası olsaydı bunu yapmak gerek olmazdı biliyorum ama ben don çünkü ben tek bir giriş noktası yok ve ben gerçekten benim nesneyi tutmak istiyorum henüz orada değilim t böyle benim devlet kaybetmek. (Şimdi Ben de vatansız siteleri programlamak gerektiğini okudum ama ben henüz bu kavramı anlamıyorum.)

Yani in short: Bu oturumda mağaza nesnelere Tamam mı, onunla herhangi bir sorun var mı?


Edit:

Temporary summary: şimdi ben onu tekrar veritabanı sorgulama içerir bile better to recreate nesne muhtemelen olduğunu anlıyoruz.

Ayrıntılı cevap olabilir belki elaborate on that aspect biraz daha!

6 Cevap

Ben bu konu eski olduğunu biliyorum, ama bu sorun geliyor ve tutar benim memnuniyeti hitaben olmamıştır:

Her zaman $ _SESSION nesneleri kaydedebilir, ya da onlara gizli form alanları içinde saklanmış verilere dayalı bütün bez yeniden, ya da onlara DB yeniden sorgulamak olsun, devlet kullanıyor. HTTP vatansız (daha fazla veya daha az, ama PUT vs GET bakınız) ama hemen hemen her şey herkes bir web uygulaması ile yapmak umurunda bir yerde muhafaza edilmesi durumunu gerektirir. Köşe ve yarıklarına içine devleti iterek teorik kazanmak çeşit tutarı gibi hareket yanlış. Devlet devlettir. Eğer devlet kullanıyorsanız, vatansız kalarak kazanmış çeşitli teknik avantajlarını kaybedersiniz. Eğer bunun üzerine uyku kaybediyor olması gerektiğini önceden bilmek sürece bu üzerinde uyku kaybetmek bir şey değildir.

Özellikle Hank Gay tarafından ortaya koymak "çifte nazar" argümanlar tarafından alınan nimet afallamış duyuyorum. Bina OP dağıtılmış ve yük dengeli e-ticaret sistemi mi? Benim tahminim hayır; ve ben daha onun $ User sınıfını, ya da her neyse, seri hale onarılamayacak yaptığı sunucu sakat olmayacağını varsaymak olacaktır. Benim tavsiyem: uygulamanız için mantıklı olan kullanım teknikleri. $ _SESSION Nesneleri sağduyu önlemlerine tabi, gayet iyi. App aniden trafik servis içinde Amazon rakip şey haline dönerse, yeniden uyum gerekir. Hayat bu.

session_start () çağrısı sınıf bildirimi / tanımı zaten PHP ile karşılaşıldı, yapılan zaman olduğu sürece sorun yok. aksi takdirde oturum deposundan nesneyi serisini mümkün olmaz.

HTTP bir nedeni vatansız bir protokoldür. Oturumlar HTTP üzerine devletini kaynak. Genel bir kural olarak, oturum durumunu kullanmaktan kaçının.

UPDATE: There is no concept of a session at the HTTP level; servers provide this by giving the client a unique ID and telling the client to resubmit it on every request. Then the server uses that ID as a key into a big hashtable of Session objects. Whenever the server gets a request, it looks up the Session info out of its hashtable of session objects based on the ID the client submitted with the request. All this extra work is a double whammy on scalability (a big reason HTTP is stateless).

  • Bir nazar: Tek bir sunucu yapabileceği işi azaltır.
  • Nazar İki: - onlar hepsi aynı oturum var Şimdi size herhangi bir eski sunucuya sadece yol, bir isteği olabilir çünkü zor dışarı ölçekli yapar. Aynı sunucuya belirli bir oturum kimliği ile tüm isteklerini sabitleyebilirsiniz. Bu kolay değil, ve başarısızlık tek bir noktadan (değil, bir bütün olarak sistem için, ancak kullanıcıların büyük parçalar için). Veya, kümedeki tüm sunucular arasında oturum depolama payı olabilir, ama şimdi daha fazla karmaşıklık var: vb ağ bağlı bellek, tek başına bir oturumu sunucu,

Bütün göz önüne alındığında, oturumda koymak daha fazla bilgi, (Vinko belirttiği gibi) performansı üzerindeki büyük etkisi. Nesne seri hale değilse Vinko işaret olarak da, oturum yaramazlık olacaktır. Yani, bir kural olarak, oturumda kesinlikle gerekli olandan daha koyarak kaçının.

@ Vinko Genellikle size geri göndermek yanıt izleme ve müşteri gizli bir giriş aşağı veri gönderme, örneğin, onu yeniden yaşıyorsanız verileri gömerek sunucu mağaza devlet sahip çalışabilirsiniz. Eğer really devletin sunucu tarafı izleme ihtiyacınız varsa, muhtemelen destek datastore'una olmalıdır.

(Vinko ekliyor: PHP oturum bilgilerini depolamak ve müşteri her zaman potansiyel ölçeklenebilirlik sorunları çözebilir verileri yeniden olması için bir veritabanı kullanabilirsiniz, ama şimdi dikkat etmeleri gerekmektedir güvenlik konularında büyük bir kutu açılır tüm kontrolü müşterinin Lütfen devlet)

  • Beklediğiniz gibi getirilemez (veya unserializable üyeleri içeren) Nesneler $ _SESSION çıkmıyor
  • Huge seans (her zaman seri hale ve devletin kaldırırken megs pahalı) sunucu üzerinde bir yük koymak

Ben hiçbir sorun gördüm dışında.

Benim durumumda, bazı özelliklere sahip bir stdclass daha karmaşık bir şey için genellikle değmez. Unserializing maliyeti her zaman bir oturum saklanan tanıtıcı verilen bir veritabanından yeniden daha fazla olmuştur. Bu serin görünüyor, ama (her zaman olduğu gibi), profil anahtarıdır.

Sen alışkanlık sayfa yükler arasında kalıcı ve görünmez bu yeniden oluşturmanız gerekir (örneğin db bağlantıları veya dosya işaretçileri gibi) bu kaynak türlerini hatırlamak gerekir.

Ayrıca oturumun boyutunu nasıl saklandığına bağlı olarak, boyutu kısıtlamaları olabilir, ya da gecikme sorunları düşünün.