PHP Nesne Önbellekleme performans

7 Cevap php

Önbelleğe alma PHP diskteki nesnelerden ziyade olmayanlar arasındaki fark var mı? Önbelleğe ise, nesneleri yalnızca TÜM site ziyaretçileri için bir kez yaratılmış olacaktır, ve eğer, onlar her ziyaretçi için bir kez oluşturulur. Bunun için bir performans farkı var mı yoksa ben zaman yapıyor israf olurdu?

Onu aşağı geldiğinde Temelde, ana soru:

Bellekte birden çok nesne, kullanıcı BAŞINA (her kullanıcı örneklenmiş nesneleri kendi belirledi)

VS

Tüm kullanıcılar için dosya önbelleğe tek nesneler (tüm kullanıcılar, örneğin, aynı hata işleyicisi sınıf, aynı şablonu işleyici sınıf ve aynı veritabanı kolu sınıfını aynı nesneleri kullanın)

7 Cevap

Önbelleğe alma PHP diskteki nesnelerden ziyade olmayanlar arasındaki fark var mı?

As with all performance tweaking, you should measure what you're doing instead of just blindly performing some voodoo rituals that you don't fully understand. When you save an object in $_SESSION, PHP will capture the objects state and generate a file from it (serialization). Upon the next request, PHP will then create a new object and re-populate it with this state. This process is much more expensive than just creating the object, since PHP will have to make disk I/O and then parse the serialized data. This has to happen both on read and write.

Genel olarak, PHP paylaşımsız bir mimari olarak tasarlanmıştır. Bu artıları ve eksileri var, ama bir şekilde bunu kaçınmak için çalışırken, genellikle çok iyi bir fikir değildir.

Bu nesneleri kullanmak için, her bir PHP komut dosyası zaten onları serisini gerekir. Bu yüzden diskte bunları önbelleğe istiyorum bellek tasarruf uğruna kesinlikle değil - bellek tasarruf olmaz.

O nesne oluşturmak için çok pahalı olduğunda bu nesneleri önbelleğe nedenidir. Sıradan bir PHP nesne için, bu durum böyle değil. Nesne pahalı bir veritabanı sorgu, bilgi veya uzak bir web hizmetinden getirilen sonucunu temsil Ama eğer, örneğin, yerel olarak önbelleğe için yararlı olabilir.

Disk tabanlı önbelleği mutlaka büyük bir kazançtır değildir. PHP ve performansı hakkında endişe kullanıyorsanız ediyorsanız, APC veya Zend Platform gibi bir opcode önbelleğe ortamında uygulamaları çalıştırıyor olmanız gerekir. Bu araçlar aynı zamanda sizin uygulama PHP nesneleri kaydetmek için kullanabilirsiniz önbelleğe sağlar. Memcached da uygulama verileri için hızlı önbellek için popüler bir çözümdür.

Ayrıca tüm PHP nesneleri tefrika, yani bir önbelleğe kaydederek olabileceğini akılda tutmak, ister disk tabanlı ya da bellek, tüm veriler için mümkün değildir. Nesne bir PHP kaynak için bir başvuru içeriyorsa, temelde, muhtemelen getirilemez.

Veri oluşturmak için statik ve karmaşık sürece, zaman kaybetmeden olacağını düşünüyorum.

Eğer kullanıcı seviyeleri belli kaynaklar için izinlere sahip olduğu belirten bir ACL (Erişim Kontrol Listesi) temsil eden bir nesne vardı söylüyorlar.

Bu ACL doldurmamak verileri bir veritabanından geliyor, özellikle, önemli bir zaman alabilir. Önbelleğe ACL çok daha çabuk örneği olabilir.

Ben önbellekleme SQL sorgusu sonuçları kullanılan ve zaman yoğun hesaplama sonuçları ve etkileyici sonuçlar vardı var. şimdi ben her istek için, getirilen verilerin sonuçlarını hesaplamak, 200.000 'den fazla kayıtları ile bir tablodan 200'den fazla veritabanı kayıtları (SQL işlevleri ve bunların hesaplama aa çok var) getirir bir uygulama üzerinde çalışıyorum. Ben bu yüzden bir dahaki sefere gerek yok, hesaplanan sonuçları önbelleğe Zend Framework Zend_Cache bileşeni kullanabilirsiniz:

  1. veritabanına bağlanmak
  2. Benim kayıtları bulmak için veritabanı sunucusu için bekleyin, hesaplama my sql fonksiyonları, sonuçlar döndürebilir
  3. belleğe en az 200 (ebil bile zengin 1000) kayıtları getirmesi
  4. Tüm bu veriler üzerinde adım ve ben onlardan ne istediğinizi hesaplamak

Ben sadece bunu:

  1. bazı dosya okuma yapacak Zend_Cache :: load () metodu, için arayın.

o (çok yanlış, ben aslında profile vermedi. ama performans kazancı oldukça görülebilir) bana her istek üzerine en az 4-5 saniye kazandıracak

Bazı durumlarda yararlı olabilir, ama etkileri dikkatli bir çalışma ile ve (vb DB sorguları, veri yapısı, algoritmalar gibi) performans iyileştirmeleri diğer tür sonra geliyor olabilir.

Eğer önbellek sorgu oldukça statik, sabit (ve sayısı sınırlı) ve veri olmalıdır. Etkili (ve buna değer) olmak üzere, sabit disk erişimi bu veriler için DB sorgu çok daha hızlı olması gerekir.

Ben bir kez kullanılan (benim düzeyde) kaçınılmaz bir sorgu ile ağır yüklü tek örnek DB, 200 + hit / s alarak ana sayfasında nispeten statik içerik, dosyaları önbelleğe alınan nesneleri seri ile. O ana sayfada kazandı yaklaşık% 40 performans.

Kod-zaman o gelişen çok hızlı ve basit, pile_put / get_contents ve un / serialize ile sıfırdan-olduğunu. Eğer arayacağınız md5 sağlama, diyelim, sonra dosyanızı adlandırabilirsiniz.

Ne yazık ki bunun için doğru cevabı yoktur. Aynı sunucu üzerinde aynı web sitesi için aynı çözümü daha iyi performans veya bir sürü kötü sağlayabilir. Bu gerçekten çok faktöre (uygulama, yazılım, donanım, yapılandırma, sunucu yükü, vb) bağlıdır.

The points to remember are: - the slowest part of a server is the hard drive. - object creation is WAY better than disk access.

Mümkünse => RAM içinde mümkün olduğu kadar HD ve önbellek verileri uzak durun.

Performans sorunu yoksa, ben ... hiçbir şey tavsiye ediyorum.

Benchmark, benchmark, benchmark: performans sorunu varsa. (Daha iyi bir çözüm bulmak için tek gerçek yol).

O konuyla ilgili ilginç bir video: YouTube Scalability

Önbelleğe sahip nesneleri disk üzerinde genellikle daha daha sonra:

http://code.google.com/p/php-object-cache/

Ancak, kendiniz için kriter ve sonuçları karşılaştırın. Thats sadece emin olabilirim.