Bir yük dengeleme kümede PHP oturumları - nasıl?

9 Cevap php

Tamam, bu yüzden bir yük dengeli PHP web eşsiz bir senaryo bu tamamen nadir var. Serseri - bu yükü dengeli olması için kullanılan vermedi. Şimdi biz sorunları almaya başlıyoruz ...

Şu anda tek sorun PHP oturumları ile. PHP oturum yapılandırma kendi varsayılan bırakıldı yüzden doğal kimse ilk başta bu konuda düşündüm. Böylece hem sunucuların oturum dosyalarının kendi küçük zulası var, ve keder o ilki oluşturulan oturumu yok çünkü, diğer sunucuya atılan bir sonraki isteği alır kullanıcı.

Şimdi, ben bu durumu çözmek için nasıl PHP kitabını okuyordum. Orada session_set_save_handler() in güzel işlevi bulundu. (Ve, tesadüfen, this topic SO) Neat. Ben web sitesinin tüm sayfaları bu işlevi çağırmak gerekecek hariç. Ve gelecek sayfaları geliştiricileri de her zaman onu aramak için hatırlamak gerekir. En iyi uygulamaları kodlama bir düzine ihlal muhtemelen söz değil, biraz beceriksiz hissediyor. Oturumları tüm sihirli bir DB veya bir hafıza önbellek falan saklanan olsun - Ben sadece bazı genel yapılandırma seçeneği ve Voilà çevirmek olabilir eğer çok daha hoş olurdu.

Any ideas on how to do this?


Added: To clarify - I expect this to be a standard situation with a standard solution. FYI - I have a MySQL DB available. Surely there must be some ready-to-use code out there that solves this? I can, of course, write my own session saving stuff and auto_prepend option pointed out by Greg seems promising - but that would feel like reinventing the wheel. :P
Added 2: The load balancing is DNS based. I'm not sure how this works, but I guess it should be something like this.
Added 3: OK, I see that one solution is to use auto_prepend option to insert a call to session_set_save_handler() in every script and write my own DB persister, perhaps throwing in calls to memcached for better performance. Fair enough.

Ben kendimi tüm bu kodlama önlemek olabilir bazı yolu da var mı? Bazı ünlü ve iyi test edilmiş PHP eklentisi gibi?

9 Cevap

Tüm sunucular bunun için aynı veritabanını kullanır böylece tüm sunucular aynı oturum bilgilerini paylaşan, veritabanında oturumları işlemek için PHP ayarlayabilirsiniz.

Bunun için iyi bir öğretici olabilir found here.

Bu işlemek yolu memcached geçer. Tüm bu alır aşağıdaki benzer php.ini değişiyor:

session.save_handler = memcache
session.save_path = "tcp://path.to.memcached.server:11211"

Biz AWS ElastiCache kullanabilirsiniz, böylece sunucu yolu bir etki olduğunu, ama aynı zamanda yerel memcached için benzer olurdu eminim.

Bu yöntem, herhangi bir uygulama kod değişikliği gerektirmez.

Sen (yazılım, donanım vb) yük dengeleme için kullandığınız ne teknoloji söz yok; ama her durumda, sorununuza çözüm yük dengeleyici "yapışkan oturumları" istihdam etmektir.

Onların oturumu ömrü boyunca tüm gelecekteki istekleri o sunucuya yönlendirilir: Özetle, bu "yeni" bir ziyaretçinin ilk istek geldiğinde, onlar küme belirli bir sunucuya atanır anlamına gelir. Pratikte bu, tek bir sunucu üzerinde çalışmak için yazılmış uygulamalar sıfır / kaç kod değişiklikleri ile dengeli bir çevreye kadar-ölçekli anlamına gelir.

Eğer böyle bir Radware aygıtı gibi bir donanım dengeleyici, kullanıyorsanız, daha sonra yapışkan oturumları küme kurulumunun parçası olarak yapılandırılır. Yeni bir kullanıcı (sağlık durumu vs için kontrol edin ve en sağlıklı / az kullanılan sunucu seçebilirsiniz) atanan böyle hangi sunucu gibi, ve ne zaman bir sunucu olur ne daha fazla kontrol: Donanım aygıtları genellikle size daha fazla ince taneli kontrolü vermek başarısız olur ve küme düşer. Donanım dengeleyici dezavantajı maliyet - ama onlar imho buna değer.

Yazılım dengeleyici gelince, kullandığınız ne kadar gelir. Google bu php oturumu ile çalışma (for example) almak yoluyla ve yazı bol - Apache için stickysession mod_proxy mülkiyet var


Edit: From other comments posted after the original question, it sounds like your "balancing" is done via Round Robin DNS, so the above probably won't apply. I'll refrain from commenting further and starting a flame against round robin dns.

Yapılacak en kolay şey, hep aynı sunucuya aynı oturum göndermek için yük dengeleyici yapılandırmak olduğunu.

Hala kullanmak istiyorsanız session_set_save_handler sonra belki auto_prepend bir göz atın.

Bu durumu varken biz bir ortak başlığında yaşayan bazı kod uygulanmaktadır.

Biz oturum kimliği biliyorsanız Esasen her sayfa için kontrol ederiz. Size tarif whehich biz durumda iseniz biz kontrol ederek kontrol etmezsek biz DB.Otherwise içinde sesion verileri saklanan varsa biz sadece yeni bir oturum başlatın.

Açıkçası bu DB kopyalanacak tüm ilgili verileri gerektirir, ama ayrı bir sınıf içinde oturum veri çevreliyor eğer o Tamam çalışır.

Ayrıca oturum eylemcisi olarak memcache kullanarak deneyebilirsiniz

Eğer php oturumları kullanıyorsanız ben oturumları kümedeki tüm sunucular arasında, saklanan düşünüyorum NFS / tmp dizini ile paylaşabilirsiniz. Bu şekilde veritabanı gerekmez.

Düzenlendi: Ayrıca memcachedb gibi bir dış hizmet (kalıcı ve hızlı) kullanımı ve memcachedb endeksindeki oturum bilgi saklamak ve içeriği ya da oturum kimliği bir karma ile tevhit olabilir.

If you have time and you still want to check more solutions, take a look at http://redis4you.com/articles.php?id=01..

Redis kullanarak hata toleransı vardır. Benim bakış itibaren, çünkü bu performanslarının memcache çözümleri daha iyi olabilir.

Çok geç olabilir, ama bu kontrol edebilirsiniz: http://www.pureftpd.org/project/sharedance

Sharedance is a high-performance server to centralize ephemeral key/data pairs on remote hosts, without the overhead and the complexity of an SQL database.

It was mainly designed to share caches and sessions between a pool of web servers. Access to a sharedance server is trivial through a simple PHP API and it is compatible with the expectations of PHP 4 and PHP 5 session handlers.