Laravel Bölüm 3’ü Optimize Etme: Nesne Önbellekleme ile Performansı Artırın
Laravel Bölüm 1’i Optimize Etmek: Temel Bilgiler
Laravel Bölüm 2’yi optimize etme: Bir veritabanı diziniyle sorgunun performansını artırın
Laravel Bölüm 3’ü Optimize Etme: Nesne Önbellekleme ile Performansı Artırın
Laravel Bölüm 4: Kuyruk Hususları, Ön Uç ve OPCACHE
Son makalemde, bir veritabanı dizininin ne olduğunu ve Laravel uygulama sorgularının performansını artırmak için veritabanı dizinlerini nasıl kullanabileceğimizi görüyoruz. Bu makalede, Laravel uygulamamızın yavaş sorgu performansını veya pahalı bilgi işlem kısmını daha da iyileştirmek için bir nesne önbelleğinin nasıl kullanılacağını göreceğiz.
Nesne önbellekleme nedir? Bir tarayıcı önbelleğe alınmasının veya sayfa önbelleğinin tersi olarak nesne önbelleğinin arkasındaki fikir, kısa bir süre boyunca önbellekte yavaş veritabanı sorgularını veya biraz pahalı bir kod hesaplamasını kaydetmenizdir. Bu, aynı verileri almak için bir sonraki çabanın, tekrar başından itibaren veri almak zorunda kalmak yerine önbellekten hızlı bir şekilde sunulabileceği anlamına gelir. Tabii ki bir nesne önbelleği kullanırken dikkate alınması gereken bazı şeyler var. Ana şey, verilerin önbellekte ne kadar sürmesi gerektiğidir. Bu, verilerinizin ne kadar hızlı değiştiğine ve verilerinizin ne kadar önemli olduğuna bağlı olacaktır. Başka bir husus, aldığınız trafik miktarıdır. Önbellekleme verileri sadece birkaç saniye boyunca boş görünebilir, ancak yüksek trafiğe sahip bir siteniz varsa, bu uygulamanızın performansında dramatik bir fark yaratabilir (daha fazla bilgi için mikro deneme ile ilgili kül makalesine bakın).
Laravel API önbelleği, önbellek verilerini (dosyalar, veritabanları, memacked ve redis dahil) saklamak için birkaç farklı “sürücüyü” destekler ve hepsi basit anahtar değerlerin depolanması olarak işlev görür. Bu makalenin amaçları doğrultusunda REDIS’i önbellek olarak kullanacağız, çünkü önbellek verilerini RAM’de depolar, böylece erişilmesi çok hızlıdır. Örneğimizi bir önceki yazıdan oluşturmanın bir örneği, görev tablomuz için bir tür rapor yapmak istediğimizi hayal edelim. Günde kaç görevin yapıldığı hakkında bir grafik göstermek istiyorsak, sorularımız şöyle görünecektir: $ sonuç = db :: tablo (‘görevler’) -> Select (db :: raw (‘sayım (*) as Total, tarih (created_at) tarih olarak ‘))) -> (‘ user_id ‘, $ user-> id) -> groupby (‘ tarih ‘) -> sipariş (‘ tarih ‘,’ asc ‘) -> get () ; Şimdi raporumuzda göstermeden önce bu sonuç hakkında bir tür işleme yaptığımızı söyleyin. Gösteri amacıyla, her sonuç için PHP’nin kısa bir süre uykusunu yaparak bunu simüle edebiliriz: foreach ($ öğe olarak $ sonuç) {// Uzmanlık İşleme Usle (5000); } Size bir performans resmi vermek için, bu kodla ~ 850.000 görev yükleme sayfası olan kullanıcılarla makinemde ~ 10 saniye gerektirir (veritabanı sorguları ~ 350 ms gerektirir). Bu rapor her gün birçok kişi tarafından kullanılıyorsa, yavaş açma zamanı hızlı bir şekilde can sıkıcı hale getirecektir. Bunu bazı önbellek nesneleriyle nasıl bitirebileceğimizi görelim.
Önbellek nesnesinin uygulanması Laravel’de önbellek nesnesini uygulamak aslında çok basittir.İlk olarak Redis’in olduğunu ve varsayılan bağlantı noktasında (6379) koştuğunuzu düşüneceğim.Ardından, .env dosyanızda Redis Cache sürücüsünü kullandığınızdan emin olun: cache_driver = Redis Laravel Redis belgesine göre, bir besteci aracılığıyla bir besteci aracılığıyla bir predis/predis paketi yüklemelisiniz, bu yüzden şimdi yapın. Yapmadım: Besteci, Laravel uygulamamızda Redis Caching’in düzenlenmesi için Predis/Predis gerektirir, gerçekten birkaç önbellek nesnesini uygulamak için kodumuzu değiştirelim.Önbelleğin ihtiyacımız olan verilere sahip olup olmadığını görmek için manuel olarak kontrol etmek yerine ve daha sonra varsa, verileri bir çağrıda almak ve saklamak için pratik hatırla Laravel yöntemini kullanacağız:
$ cacheKey = ‘görevler.’ . $ user-> id; $ sonuçlar = cache :: hatırlayın ($ cacheKey, şimdi () -> addHours (24), function ($ kullanıcı) {$ sonuç = db :: tablo (‘görevler’) -> Select (db :: raw (‘Sayım (*) toplam olarak, tarih (created_at) tarih olarak’)) -> burada (‘user_id’, $ user-> id) -> groupby (‘tarih’) -> sipariş (‘tarih’, ‘asc ‘) -> get (); foreach ($ öğe olarak $ sonuç) {// uzmanlık işleme usle (5000);} dönüş $ sonuçları;}); Şimdi, bu kod ilk kez çalıştırıldıktan sonra, sonuçlar en başından itibaren alınmak yerine her istenen Redis nesnesi önbelleğinden alınacaktır. Bu kodun performansını önceki kriterlerimizle karşılaştırmak için ~ 10 saniye, aynı kod şimdi 30 MDTK’nın altında çalışıyor. Tek yaptığımız, kodu tek bir önbellek yöntemine sararak nesne önbelleğini etkinleştirmektir :: Unutmayın! Yukarıdaki koddan not edilecek bazı şeyler var. İlk olarak, önbellek verilerini depolamak için kullandığımız anahtar, bu kullanıcı için benzersiz hale getirmek için $ kullanıcı-> id’ye sahiptir. Bir nesne önbelleği kullandığınızda verilerin diğer kullanıcılara sızmayacağına veya koddaki değişkenlerin değiştiği, ancak önbellek anahtarına dahil edilmediğinden yanlış verilerin görüntüleneceğine dikkat etmelisiniz. Örneğin, Created_at tarihine göre görevleri filtrelemek istersiniz. Tarihe göre filtrelemek için KUII’ye başka bir madde eklerseniz, kuyruğun sonuçlarını değiştirecektir. Bu nedenle, filtrede kullanılan değişkenleri önbellek tuşuna eklediğinizden emin olmanız gerekir.
İkincisi, bu verileri 24 saat boyunca nesne önbelleğinde saklıyoruz, çünkü günde yalnızca bir kez değişecektir. Ancak, veriler günün başında önbellek değilse, rapor hala ertesi günün başında süresi dolmuş verileri görüntüleyebilir. Bu sorunun azaltılmasına yardımcı olmak için zaman aralığı azaltılabilir veya önbellek günün başında hazırlanabilir (örneğin Cron kullanılarak). Bu, verilerin önbellekte ne kadar süre depolanması gerektiğini seçmenin bazen cevaplaması zor bir sorudur. Bir dahaki sefere bir nesne önbelleğinin ne olduğunu ve Laravel’de nasıl kullanılacağını bildikten sonra, gerektiğinde performansı artırmak için Laravel uygulamanızda uygulamaya başlayabilmeniz gerekir. Bir veritabanı dizin eklemek gibi, nesne önbelleğini ne zaman kullanacağını ve verileri önbellekte ne kadar sürdüreceğini öğrenmek için küçük bir sanat var. İyi bir süreç, uygulamanızın en kötü performans gösteren kısmını tanımlamak, uygunsa bir nesne önbelleğini uygulamak, performans iyileştirmesini ölçmek ve başarılı olursa durulayın ve tekrarlayın. Yavaş yavaş önbellekleme nesneleri eklemede yanlış bir şey yoktur. Bir sonraki makalemde, bazı ağır işleri sökmek ve ön uç performansını iyileştirmek gibi performansı iyileştirmek için Laravel uygulamasına uygulayabileceğimiz son birkaç taktik göreceğiz. Daha önce Laravel’de bir önbellek nesnesi kullandınız mı? Paylaşacak nesnelerin önbellekleme ipuçları veya hikayeleri var mı? Yorumlarda bize söyleyin. Bu, “Laravel’i Optimize Etmek” dizisinde 4. Madde’nin 4’üdür.
Laravel Bölüm 1’i Optimize Etmek: Temel Bilgiler
Laravel Bölüm 2: Sorguların performansını temel dizine ekleme ve optimize etme ile iyileştirme Laravel Bölüm 3: Nesne önbellekleme ile performansı artırın
Laravel Bölüm 4: Kuyruk Hususları, Ön Uç ve OPCACHE