PHP istekleri arasında nesneleri kalıcı nasıl

3 Cevap php

Ben raylar, Merb, Django ve geçmişte asp.net mvc uygulamaları kullanarak oldum. Ne ortak sahip (yani soruya alakalı) onlar çerçeveyi oluşturan kod olması. Bu genellikle (yönlendirme kurma veya kontrolörleri vb mevcut olduğu kontrol gibi) web sunucusu dönüştürülmeden kadar kalıcıdır nesneleri ve devlet yaratmak demektir.

Bildiğim kadarıyla PHP daha fazla bazı baytkoduna çalıştırmak oluyor her zaman derlenmiş bir CGI betiği gibi, ve istekten sonra o atılır oluyor. Tabii ki, oturumları olabilir aynı kullanıcının istekleri arasında veri kalıcı ve ben gördüğünüz gibi sunucu düzeyinde istekleri arasında nesneleri kalıcı hangi ile APC gibi uzantıları vardır.

Benim soru: nasıl bir raylar ve bu gibi çalışır bir PHP uygulaması oluşturabilirsiniz? Ben ilk istekleri 2. ve sonraki istekleri önceden ayarlanmıştır nesneleri kullanın daha sonra, çerçeveyi oluşturan bir uygulama anlamına gelir. Mod_php önbelleğe alma tesisi inşa bazı var mı? (Örneğin, o idam php uygulamaları derlenmiş bayt kodu saklayan) Yoksa APC veya benzer bazı uzantıları bu sorunu çözmek için tek yol kullanıyor? Bunu nasıl yapardın?

Teşekkürler.

DÜZENLEME: Alternatif bir soru: Ben çok büyük bir set süresi olan büyük bir PHP uygulaması oluşturmak, ancak küçük çalışma süresi (gibi yukarıda belirtilen çerçevelerde) o zaman nasıl yapmalıyım "önbellek" zaten ayarlanır şeyler (bu kudreti Bunun için zaten PHP kalıcı bağlantıları var çünkü), belki veritabanı bağlantıları haricinde, bir çok şey anlamına gelir.

Zaman büyük bir set kadar haklı: ne nesneler mevcut olduğunu kontrol edin ve buna göre çalışma zamanını ayarlamak için PHP kullanarak yansıma yaşıyorum. Yansıma bir sürü yapıyor genellikle yavaş, ama bir sadece bir kez yapmak zorunda (ve kaynak kodu değiştirilmiş, yalnızca yeniden değerlendirmek).

EDIT2: Bu zaman APC var gibi görünüyor. Otomatik bytecode önbelleğe gerçeği bilmek iyidir.

3 Cevap

APC tek çözümdür ancak APC tüm konularda dikkat çekmek eğer emin değil.

İlk olarak, komut APC ile bir kez derlenecek ve bayt kodu bellekte depolanır.

Eğer kurulum için uzun zaman ayırdığınız bir şey varsa, aynı zamanda kullanıcı veri olarak APC bunu önbelleğe alabilir. Örneğin, ben bu her zaman yapmak,

            $table = @apc_fetch(TABLE_KEY);

            if (!$table) {
                    $table = new Table(); // Take long time
                    apc_store(TABLE_KEY, $table);
            }

APC ile tablo oluşturma görevi sadece sunucu örneği için bir kez gerçekleştirilir.

PHP (ve bu konuda yakut) yorumlayıcı dillerdir. Yani dosyaları rica olunur her zaman ayrıştırmak ve ben bir sözde bayt koduna dönüştürülür söyleyebiliriz herhalde. Bu bir PHP daha fazla böyle RoR demek daha ama her ikisi de aynı şekilde davrandığını söyleyebiliriz daha 'görünür' olduğunu.

Istekler arasında veri devam eden bir özelliği, sunucunun değil dilin kendisi bir özelliğidir. Örneğin, konuşmak RoR yönlendirme önbelleğe alınmış aslında ama bu sunucunun yerel önbelleğe oluyor. Bu derlenmiş ve hızlı readins için saklanmaz. Sunucusu (ve sunucu tarafından ben kutusu ve web hizmeti örneklerini hem demek) bu bilgiler gitti yeniden başlatılır. 'Çerçeve kurma' hala çerçeveye dahil HER dosyası ayrıştırma içerir konuşuyoruz. Raylar tekrar istek sırasında her dosyayı ayrıştırır ve yeniden, üretim düzeyi özellikleri aslında önbellek hafızasına ama kesinlikle gelişme bu veriler yok olabilir. O sunucudan değil dilinin bir özelliği olduğunu göstermektedir çünkü bu söz tek nedeni budur.

Aynı şeyi elde etmek için PHP Zend Server'ı kullanabilirsiniz. Bildiğim kadarıyla bu 'derlemek' söylendi ve ne zaman byte kodunu kullanacaksınız sadece PHP yorumlayıcısı. Aksi halde size istekleri üzerine devam etmek istediğiniz veri depolamak için bir yol bulmak gerekir. Eğer belirtildiği gibi APC çok güçlü bir özelliktir, bir daha dağıtılmış bir Memcached ve sonra tabii ki disk ve benzeri daha kalıcı formlar var sql.

Bunu belirli özelliği istiyorum neden bilerek ilgileniyorum. Bunu yaparak 'çözülür' olacaktır performans sorunlarını fark var mı?

Ben bazı yanlış genellemeler yaptığını düşünüyorum. Bu çerçeveler Tüm (ex: Rails) farklı konfigürasyonları ile çalıştırılabilir. Bazı altında, bir işlem, her istek için oluşturulur. Bu tabii ki performansı acıyor, ama bu çerçeveler uzun süren bir süreç güvenmeyin göstermektedir. Gerekirse onlar (vb, ayrıştırma yapılandırma dosyaları nesneler yaratmak) her isteği şeyler kurabilirsiniz.

Tabii ki, mod_php (PHP genellikle kullanılan yol) CGI aksine, web sunucusu süreci içinde çalışır. Yani (örneğin) CakePHP'de arasında temelden farklı bir şey görmek ve Raylar yok.

Ben belki Python en WSGI veya Ruby Rack, ancak PHP gibi bir şey arıyoruz düşünüyorum. Bu uygulama için bir arabirim (dil nasıl çalıştırıldığını bağımsız olarak) kapsar. Yeni bir istek için, bir uygulama nesnesinin yeni bir örneği oluşturulur. Bildiğim kadarıyla, bu PHP için mevcut değil.