MySQL ve PHP ile oluşturulmuş dinamik bir web siteniz var mı? Web siteniz ve kitleniz büyüyorsa, web sitesinin performansıyla ilgili sorunlar yaşabilirsiniz. Daha büyük web sayfaları, çalışmakta olduğunuz sunucuyu yorar ve bir çok kullanıcıyı kaçırabilirsiniz. Bu yüzden web sayfalarını küçültmek ve tarayıcıların rahat okuyabileceği şekilde düzenlemek gerekir. Sizlere bu yazımızda php cache nedir bunlardan bahsedeceğiz.

Öncelikle php cache bir önbellekleme anlamına gelmektedir. Çoğu web sitesinde zaten siz farkında olmasanız da kullanılmaktadır.

Web sitenizin neden bir PHP önbelleğine ihtiyacı var?

Önbelleğe alınmadan dinamik bir web sitesi çok sayıda ziyaretçiyi işleyemez. Bir ziyaretçi dinamik bir web sitesine erişirse, tüm veritabanı sorguları ve PHP komut dosyası yürütmeleri RAM belleği ve CPU gücü kullanır. Tüm sunucu kaynakları sınırlı olduğundan, web sunucunuz ve web siteniz yavaşlar veya kullanılamaz hale gelir.

Örneğin…

WordPress ile bir web sitesi derlemesinden bir sayfayı test ettik. İlk testi önbellekleme etkinleştirilmeden gerçekleştirdik. Test sırasında her iki CPU’nun da daha fazla çalışması gerekiyor ve yük biraz yüksekti. Aynı anda 50 kullanıcının web sitesini ziyaret ettiği anda 15 PHP işlemi kullanıldı. URL yükleme süresi 100 ms’nin üzerindeydi.

Sonra aynı testi önbellekleme etkinken yaptık. Sitedeki yük çok daha düşüktü ve CPU neredeyse hiç kullanılmadı. Şu anda 50 eşzamanlı kullanıcının siteyi ziyaret ettiği anda yalnızca 5 PHP işlemi kullanılarak. Önbelleğe alınan sürüm, URL yükleme süresi 50 ms’den daha kısa süreden çok daha hızlıydı.

15 php işlemi yerine 5 php işlemi cache nin önemini bize açıklıyor.

Web sitenizi hızlandırmak için ne tür PHP önbelleği kullanabilirsiniz?

Farklı önbellek türleri vardır ve hepsinin farklı işlevleri vardır. Listemiz yalnızca PHP komut dosyalarıyla birlikte kullanılan sunucu tarafı önbellek türlerini içerir . Tarayıcı önbelleği, veritabanı önbelleği veya proxy önbelleği gibi diğer önbellek türleri bu makalenin kapsamı değildir. Onlar için ilerleyen günlerde özel olarak yazı yazacağım takipte kalmak için sitemizin facebook sayfasını takip edebilirsiniz.

Tam sayfa önbellekleme

Sayfa önbelleğe alma en önemli PHP cache türüdür. Adından da anlaşılacağı gibi, tüm PHP sayfası önbelleğe alınır. Çoğu durumda, önbelleğe alınan sayfa sürümü sunucunun sabit diskinde belirli bir süre depolanır. 

Eğer “php cache” için arama yaparsanız, üstte PHP Cache web sitesini bulacaksınız. PHP önbellek şirketi, APC, Redis, MemCached, FileSystem ve diğerleri için farklı PHP önbellek türleri vardır. PHP kütüphaneleri son zamanlarda çok iyi korunmamaktadır.

İyi bir PHP önbellek kütüphanesi bulmak o kadar kolay değil. Ama bir tane buldum…

PageCache

Bu önbellek kütüphanesi, başlangıçtaki PHP yazılımcısı için belki de en iyi seçimdir. Kurulumu kolaydır ve gerekli kodu mevcut PHP betiklerinize uyarlayabilirsiniz. PHP tabanlı web siteniz eski ve yordamsal kodla yazılmış olsa bile, PageCache iyi bir seçimdir. Aşağıda en önemli özelliklerin kısa bir özeti bulunmaktadır.

  • Sıfır konfigürasyonla rar çıkar çıkmaz çalışır!
  • PSR-16 uyumlu önbellek adaptörü (Redis veya Memcached).
  • Mobil cihazlar için dahili sayfa önbellekleme.

PageCache PHP örneği

Dediğim gibi, PageCache kullanmak basit. Composer’ı kullanarak kütüphaneyi kurmanız ve PHP betiğinizin üstüne aşağıdaki PHP kod parçacığını eklemeniz yeterlidir; PHP önbellek kütüphanesi önbelleğe alınmış dosyayı oluşturur ve sağlar.

<? Php
Require_once __DIR__. '/../vendor/autoload.php' ;
dene {
    $ cache = yeni  PageCache \ PageCache ();
    $ cache -> config ()
                    -> setCachePath ( '/ your / cache_path /' )
                    -> setEnableLog ( true )
		    -> setCacheExpirationInSeconds ( 86400 );
    $ cache -> init ();
} catch (\ Exception  $ e ) {
    // PageCache hatasını kaydedin veya hiçbir şey yapmayın.
    // PageCache hatası olması durumunda, sayfa önbellek olmadan normal şekilde yüklenir.
}
// PHP kodunuzun geri kalanı, aşağıdaki her şey önbelleğe alınır

PHP sayfa önbelleği ve popüler çerçeveler

Yeni bir projeye başlarsanız daima Laravel, Symfony, CodeIgniter , Yii veya Zend gibi bir PHP çerçevesi kullanmayı düşünmelisiniz . Kendi PHP önbellek eklentisini veya bileşenini sunarlar. Bir PHP çerçevesi kullanıyorsanız, tüm kodu yazmanız gerekmez ve en önemli kütüphaneler zaten paketlenmiştir. Gerekli tüm kütüphaneleri kendiniz seçmeniz (ve test etmeniz) gerekmez. 

PHP önbellek bileşenlerinin çoğu tüm PHP sayfalarını önbelleğe alabilir ve ayrıca Redis veya Memcached ile bir nesne önbelleği için adaptörler sağlayabilir.

Nesne önbelleğe alma

Bir sayfanın önbelleğe alınması dosya sisteminizde olurken, nesne önbelleği tamamen farklı çalışır. Nesne önbelleğe alma çoğunlukla dizeleri, dizileri veya hatta veritabanı sonuç kümelerini depolamak için kullanılır. Bu nesneler RAM belleğinde ve bazen de veritabanında saklanır. Bu blog gönderisi için size nesne önbelleği olarak kullanabileceğiniz iki depolama sistemi hakkında daha fazla bilgi vereceğim: Memcached ve Redis.

Memcached nedir?

Memcached ilk olarak 2003 yılında Brad Fitzpatrick tarafından geliştirilmiştir. Bu oldukça eskidir, aynı yıl PHP 4 ve MySQL 3.2.3 kullanıyoruz. Memcached’i farklı programlama dilleriyle kullanabilirsiniz ve PHP için biri uzantı önbelleği, diğeri Memcache olarak adlandırılır (eksik “d” notu). Sonuncuyu kullanmayın, çok iyi korunmaz.

Memcached çok hızlıdır ve veritabanınızdaki yükü düşük (er) düzeyde tutarken web sitenizi hızlandırmanıza yardımcı olabilir. 

PHP Memcached örneği

Nesne eklemek ve okumak çok kolaydır ve aynı bilgileri bir MySQL veritabanından eklemek / almaktan daha az kod alır.

<? Php
$ memcaches_obj = yeni  Memcached ();
$ memcaches_obj -> addServer ( '127.0.0.1' , 11211 );

if (! $ value = $ memcaches_obj -> get ( 'my_object_key' )) {
	$ value = 'Bazı Değerler' ;
	// yeni değerleri 1 saat boyunca sakla
	$ memcaches_obj -> set ( 'my_object_key' , $ değer , 3600 );
}
$ memcaches_obj -> quit ();

Nesne önbelleğini yeniden oluştur 

Redis, çoğunlukla Salvatore Sanfilippo tarafından sürdürülen ve Redis Labs tarafından desteklenen bir bellek içi veri yapısı deposudur. Phpredis uzantısını PECL kullanarak kurabilirsiniz. Şu anda PHP uzantısıyla bu uzantı hakkında herhangi bir bilgi bulamıyorsunuz. Bu gerçekten bir sorun değil, çünkü Redis geliştirme dünyasında çok popüler ve çevrimiçi birçok bilgi var. 

PHP Redis örneği

İşlevler veya yöntemler Memcached için kullandığımız koda çok benzer. 

<? Php
dene {
    $ redis = yeni  Redis ();
    $ redis -> bağlan ( 'localhost' , 6379 );
    $ redis -> setEx ( 'my_object_key' , 3600 , 'Bazı Değerler' );
	//Değer elde etmek
    $ value = $ redis -> get ( 'my_object_key' );
} catch ( İstisna  $ ex ) {
    echo  $ ex -> getMessage ();
}

Hangi nesne önbelleğini seçtiğiniz size bağlıdır, her ikisi de hızlı ve kullanımı kolaydır. Şahsen Memcached için yapılandırılmış PHP belgelerini seviyorum. 

PHP kitaplıklarının ve çerçevelerinin Redis veya Memcached için neden adaptörler kullandığını anlıyorsunuz. Verilerinizi farklı nesne önbellek sistemlerinde saklamak için aynı yöntemleri kullanabilirsiniz.

Parça Önbellekleme

Bu önbellek biraz sayfa önbelleğe alma gibi görünür, ancak bir web sayfasının bölümleri için önbelleğe alınmış bir sürüm oluşturmak için kullanılır. Sayfanın bir kısmının dinamik olması gerekiyorsa bu çok yararlıdır. Çok basit bir örnek, portal web sitesindeki “Merhaba kullanıcı adı” metnidir; burada tüm bilgiler, ad dışındaki tüm kullanıcılar için aynıdır.

Dosya sistemi üzerinden sayfa önbelleği gibi kod parçalarınızı saklayabilir veya bir nesne önbelleği kullanabilirsiniz.

PHP OpCache

Bu PHP önbelleği farklı çalışır. Oluşturulan HTML kodunu bir sayfa önbelleği gibi önbelleğe almaz, komut dosyasının PHP kodunu önbelleğe alır. PHP OpCache, PHP kodunu derler ve bu sürümü RAM belleğinde saklar. Bu şekilde PHP, daha az CPU gücü kullanırken PHP kodunu çok daha hızlı işleyebilir. Bazı önemli OpCache PHP işlevleri şunlardır:

PhpFastCache

Bu PHP önbellek kütüphanesi daha büyük projelerden biridir ve bazı çerçevelerin bir parçası değildir. Yüksek trafikli bir web sitesi için önbelleğe ihtiyacınız varsa, PhpFastCache ihtiyacınız olan kütüphanedir. Kitaplığı, dosya önbelleği, SQLite, MongoDB, Redis ve Memcached gibi farklı önbellek türleri için kullanabilirsiniz.

PhpFastCache kodu örneği

Aşağıdaki kodla Memached kodu örneğiyle aynı nesneyi alırız. Biraz daha fazla kod, ancak değerlerin bazılarını değiştirirseniz, Redis veya başka bir önbellek sistemi için aynı kodu kullanabilirsiniz.

Hangi nesne önbelleğini seçtiğiniz size bağlıdır, her ikisi de hızlı ve kullanımı kolaydır. Şahsen Memcached için yapılandırılmış PHP belgelerini seviyorum. 

PHP kitaplıklarının ve çerçevelerinin Redis veya Memcached için neden adaptörler kullandığını anlıyorsunuz. Verilerinizi farklı nesne önbellek sistemlerinde saklamak için aynı yöntemleri kullanabilirsiniz.

Parça Önbellekleme

Bu önbellek biraz sayfa önbelleğe alma gibi görünür, ancak bir web sayfasının bölümleri için önbelleğe alınmış bir sürüm oluşturmak için kullanılır. Sayfanın bir kısmının dinamik olması gerekiyorsa bu çok yararlıdır. Çok basit bir örnek, portal web sitesindeki “Merhaba kullanıcı adı” metnidir; burada tüm bilgiler, ad dışındaki tüm kullanıcılar için aynıdır.

Dosya sistemi üzerinden sayfa önbelleği gibi kod parçalarınızı saklayabilir veya bir nesne önbelleği kullanabilirsiniz.

PHP OpCache

Bu PHP önbelleği farklı çalışır. Oluşturulan HTML kodunu bir sayfa önbelleği gibi önbelleğe almaz, komut dosyasının PHP kodunu önbelleğe alır. PHP OpCache, PHP kodunu derler ve bu sürümü RAM belleğinde saklar. Bu şekilde PHP, daha az CPU gücü kullanırken PHP kodunu çok daha hızlı işleyebilir. Bazı önemli OpCache PHP işlevleri şunlardır:

PhpFastCache

Bu PHP önbellek kütüphanesi daha büyük projelerden biridir ve bazı çerçevelerin bir parçası değildir. Yüksek trafikli bir web sitesi için önbelleğe ihtiyacınız varsa, PhpFastCache ihtiyacınız olan kütüphanedir. Kitaplığı, dosya önbelleği, SQLite, MongoDB, Redis ve Memcached gibi farklı önbellek türleri için kullanabilirsiniz.

PhpFastCache kodu örneği

Aşağıdaki kodla Memached kodu örneğiyle aynı nesneyi alırız. Biraz daha fazla kod, ancak değerlerin bazılarını değiştirirseniz, Redis veya başka bir önbellek sistemi için aynı kodu kullanabilirsiniz.

<? Php
 Phpfastcache \ CacheManager kullanın ;
Kullanım  Phpfastcache \ Drivers \ Memcached \ Yapılandırma ;
__DIR__ gerektirir . '/../../vendor/autoload.php' ;
$ InstanceCache = CacheManager :: getInstance ( 'memcached' , yeni  Config ([
    'host' => '127.0.0.1' ,
    'bağlantı noktası' => 11211
]));
$ CachedString = $ InstanceCache -> getItem ( 'my_object_key' );
if ( is_null ( $ CachedString -> get ())) {
    $ CachedString -> set ( 'Bazı Değer' ) -> expiresAfter ( 60 ); // dakika
    $ InstanceCache -> save ( $ CachedString );
    echo  $ CachedString -> get ();
} başka {
    echo  $ CachedString -> get ();
}

PHP önbelleği ve WordPress

Bu WordPress web sitesi (veya blog) gibi, bugünlerde WordPress ile birçok web geliştirme çalışması yapıyorum . Tam sayfa önbellek oluşturmak için birkaç olgun önbellek eklentisi ve ayrıca Redis veya Memcached ile nesne önbellekleme için bazı eklentiler vardır. WordPress’in kendi nesne önbellek arayüzü vardır. Bu, nesne önbellek API’sini Memcached ile bağlarsanız ve bir nesnenin içinde bir değer depolarsanız, değerin veritabanında değil Memcached’da depolandığını gösterir.

Sık kullandığım WordPress önbellek eklentilerinin listesi.

WP Süper Cache

Sunucunuz Apache tabanlıysa, bu sayfa önbellek eklentisi süper hızlı ve kararlıdır. WordPress’in arkasındaki şirket Automattic tarafından korunuyor. Nesne önbelleği sunmaz, ancak parça önbelleğini destekler (ileri düzey kullanıcılar için).

WP Rocket

Bu WordPress önbellek eklentisi de tam sayfa önbellek eklentisidir, ancak bazı güzel ekstralara (Cloudflare entegrasyonu, kullanıcı önbelleği…) ve çok hoş bir arayüze sahiptir. Bu eklenti ücretsiz değil, ama bence her kuruşa değer. Bu blog için WP roketi kullanıyorum ve eklenti bana 1 saniye yükleme süresinden tasarruf etti (WP Super Cache ile karşılaştırıldığında).

Basit Önbellek

Taylor Lovett tarafından geliştirilen bu basit önbellek eklentisi o kadar popüler değil, ama neredeyse benzersiz bir özelliğe sahip: Nesne önbelleği (Memcached veya Redis). Çok fazla seçeneği yok, sadece önbelleği etkinleştirin ve işiniz bitti. 

Nginx ile güzel oynayan bir eklenti ararken Basit önbellek buldum. Basit Önbellek ile Nginx yapılandırmanızda değiştirmeniz gereken yalnızca bir satır vardır. Nginx için diğer iki eklentiyi de kullanabilirsiniz, ancak daha fazla Nginx yapılandırmasını değiştirmeniz (ve test etmeniz) gerekir. WP Rocket için Nginx’te neyi değiştirdiğimi bilmek isteyip istemediğinizi bana sorun.

Sonuç Olarak

Hangi PHP önbellek türünün en iyisi olduğu, web uygulamanıza, sunucu yapılandırmasına ve olası sunucu yüküne bağlıdır. PHP önbellekleme genellikle basit bir iş değildir. Basit bir şey yapmak istiyorsanız, WordPress’i ve mevcut önbellek eklentilerinden birini kullanın.