Serialize kullanmadan PHP Önbellek nesnesi

5 Cevap php

Ben bir PHP komut dosyası oluşturmak karmaşık bir nesne var. Ben sonraki istekleri onu yeniden var, ya da unserializing ve yeniden zaman harcamak yok böyle bu nesneyi saklamak için bir yol arıyorum. XDebug kullanarak ben bu nesneyi bina tüm istek zaman yarısını harcamak bulabilirsiniz. Ben APC (veya memcache) açıkça nesneyi saklamak bile, onu unserialize ve tüm sınıfları yüklemek için zaman neredeyse sürece ilk etapta nesneyi oluşturma gibi alır.

PHP bir "derlenmiş" nesnesini saklamak ve daha sonra yüklemek mümkün olup olmadığını bilmiyorum. Bu mümkün mü? Başka çözümler var mı?

Ben bu mümkün olduğundan emin değilim, ama ben topluluk sormak gerektiğini düşündüm.

EDIT: Nesne bir ikili ağaç ve bir karar ağacı olarak kullanılır. Kod temelde hızla ağaçtan bir cevap dönmek için gerekli olan bir API. Bu, tüm bu yüzden mümkün performansını en üst düzeye çıkarmak için çalışıyorum giderek artan oranda gerçekleştirmek gerekiyor.

5 Cevap

Igbinary PHP uzantısı içine bak. Bu, tefrika ve unserialize için yedek bir düşüş olduğunu ve sizin ihtiyaçlarınıza uygun olabilir.

Bunun yerine bellek kullanımını azaltır ve aynı zamanda seri için zaman ve unserialize nesneleri azalır bir dize ikili bir biçimde nesneleri saklar.

Bu bir nesne unserializing sürecinde geçmesi rağmen, ikili biçimi uygulamasında kullanım için bu süreci makul yapmak için yeterli performansı artabilir.

Belki çözüm, tek, büyük, pahalı nesne inşa etmektir.

Bir PHP uygulama hemen hemen her sayfasında yük, bir tek, dev bir nesneye bağlıdır bir çözüm üzerinde bir mazisi temiz başlar verilen dil için kötü bir seçimdir. Eğer nesne ve ne hakkında çok fazla detaya gitme yana ne yapar, ben emin olamam, ama sen gerçekten nesne her sayfa yük yaptığı her şeyi gerek yok sanıyorum ediyorum. Bu durumda ise, ciddi gerekli gibi örneğini daha küçük, basit sınıfları bir dizi bölerek düşünebilirsiniz.

igBinary daha hızlı / seri unserialize sürecini elde yardımcı olabilecek yararlı bir uzantısıdır. Bir daha zeki, ikili biri ile standart serileştirme mekanizması değiştirir. Eğer kendi sunucunuzu yönetmek ve bu yüklemek, bir cami bulunuyor.

HAYIR, olmayan bir tefrika halinde bir PHP nesne saklamak mümkün değildir; en azından değil, aşağıdaki önbelleğe alma çözümlerle (I've tried these ones ; don't know about the other that might exist),

  • dosya
  • memcached
  • APC
  • Database (yeap, you can think about caching things in DB ^^ Drupal does it by default, for instance )

O kadar zaman nesne nesneleştirmek olduğunu sürerse, belki de gerçekten big? Eğer boyutunu azaltabilir herhangi bir yolu var mı?

For instance, meybe you have a big bunch of HTML code in that object ? If so, could it be stored in another cache entry ?
(serialization is "transforming some data to a string ; so, if you are already working with a string, you don't need to re-serialize it to store it in cache)

Ya da belki de sıfırdan oluşturmak için çok zaman almaz? Bu durumda, gerçekten gerekli önbelleğe?

Bu durumda daha iyi bir seçenek kendi sunucu yazmak olacaktır.

bu php kolayca yapılabilir - ve zaten kodu var - ama yazma sunucularına gelince php çoğunun ilk tercihi olmayabilir.

  • (php gerçekten mulithread hazır değildir ve istekleri seri cevap olarak) bu app yeni darboğaz olabilir
  • tüm Shell özel cli betikleri izin
  • karar ağacı değişiklikleri varsa, ağacını oluşturmasını sunucu bildirmek zorunda