Kategoriler
Wordpress faydalı kodlar

WordPress cache uygulamasi (eklenti degil) – CPU, ve kasilma sorunlari olanlar icin!

Bir arkadas bana wordpress konusunda sorunlari oldugundan ve nasil bunu asacagini sordu. Bende bir cok etken var, konuya ve eldeki malzemeye gore bu liste uzar, yapilacaklar artar yada azali dedim. Sonrasinda bana r10 sitesinde bir konu gosterdi ve nasil oluyor dedi. Tam emin degilim ancak satisi gerceklestiren arkadas file cache ornegini kullaniyor. Benim cok cok onceleri kendi temalarimda da kullandigim bir teknik.

DEMO: ornek uygulanmis bir websitesi

Buraya tiklayarak dosyalari indirebilirsiniz.

Basit bir yontem, genelde tema tasarimcilari file cache uygulamasini tema dosyalarina uygular, ancak bunun tek getirisi an sayfadaki sorgu icin olacaktir. O sorguya gelene kadar wordpress 100 e yakin sorgu yapabilir + eklenti ve temaya gore bu sorgu sayisi dahada cok artiyor.

File cache uygulamasini tema dosyasina uygulamak yerine wordpress’in index.php dosyasi uzerine uygulamaniz daha mantikli olacaktir. Cunku cache alinan sayfa bilgileri, sonraki cagrilisinda 0 sorgu ile ekrana basilacagi icin kusursuz bir 100% hiz elde etmis olacaksiniz.

Bu arkadas, yaninda bu sorundan muzdarip diger arkadaslara hitaben kucuk bir kod yazdim index.php icin ve giris dosyasinada ufak bir edit yaptim.

Normalde file cache uygulanan bir sayfada admin yada kullanici girisi olsa dahi ilk cache alindigi hali gorunecektir. Bunun olumsuz tarafi cok olacaktir. Yorum yapamam, yeni yorumlari gorememe, yada diger gorsel ve anlik iletisimde bulunan eklentilerin verilerinde aksakliklar gibi. Ben bu hazirladigim index.php dosyasi kullanici giris yapmis ise cache ozelligini uygulamiyor, eger misafir ise yani giris yapmamis ise cache aliyor yada zamani dolmamis ise onceki kaydi gosteriyor.

Konu goruntuleme eklentisi kullaniyorsaniz eger javascript ile bunu yapan bir uygulama secmenizi oneririm, aksi taktirde giris yapmayan kullanicilar konularinizin okunmasina etki etmeyecektir. Bir sonraki versiyonda bu konuda da bir calisma yapabilirim isterseniz :)

KURULU

Kaynak dosyalarini konu altindan indirebilirsiniz arkadaslar, tek yapmaniz gereken wordpress kurulu sitenizin ana dizinine atmaniz. Uzerine yazsin secenegi cikarsa evet diyin. (Bunun oncesinde dosyalarinizi yedek alabilirsiniz) Yedek almaniza gerek olmayabilir, cunku olumcul degisiklikler yapmadim dosyalarda :) sisteminize herhangi bir hata vermeyecektir.

Bu mod hazirlanirken buradaki degisken file cache alanindan kopya cektigimide hatirlatirim :)

Dosyalar wordpress son versiyon 3.9.1 icindir, ancak eski versiyonlarda da sorunsuz ve hatasiz calisacaktir, cunku dedigim gibi herhangi bir olumcul degisiklik yapmadim.

Buraya tiklayarak dosyalari indirebilirsiniz.

R10 sitesinde satis konusu bulunan arkadas umarim bu konudan etkilenmez, kendisinin isine engel olmak icin bu konuyu acmiyorum, yardim isteyen bir arkadasa, onun nezdinde de ihtiyaci olanlara yardimci olmaktir amacim. Zira kendi uygulamasi burdakinden gelismis de olabilir :) Satin alacak arkadaslar bu konu sadece yardimci olmak amacindadir, ilgili arkadas ilede ticaret yapmaniz uygun olabilir sizin acinizdan.

NOT: Detayli bir anlatim yapma geregi dumadim, duzenlemenin ilk versiyonudur, zamanim olursa gelistirebilirim, farkli ozellikler ekleyebilirim. Bu kullanici geri bildirimine bagli olarak daha once yada daha sonra sureleri ile sinirli olabilir :)

Kategoriler
Webmaster yardım Wordpress

WordPress – Kullanmadığınız cache eklentilerini kaldırın!

Küçük ve kısa bir bilgilendirme olacka arkadaşlar. Sisteminizde kullandığınız süper cache, total cache yada benzeri eklentileri çoğu zaman kurup sonrada pasif hale getiriyoruz. Bu durum çok yanlış sonuçlara neden olmaktadır. Şiddetle kullanılmayan eklentilerin, özellikle bu eklentiler file cache yada sql cache kategorisine giriyorsa.

Siz cache eklentilerini pasif yaparsınız ancak eklentinin daha önce yerleştirdiği dosyalar yüzünden hala sisteminiz cache dosyalarını göstermeye devam edecektir. Bu ayarlar başta wp-config.php ye eklenenlerde dahil olmak üzere .htccess dosyasına eklenenler yüzünden olabilmektedir. Bu aslında ileri düzey bir sorun değil ancak bu sorunun ortaya çıkması ihtimal durumlardan biriside nginx ve benzeri proxy programlarının cache özelliğinden yararlandığımızda olabilmektedir. Yani sisteminizde nginx varsa pasif duran cache eklentileriniz tehlike yaratabilir.

Eğer pasif eklentileri ilerde kullanmayı düşünüyorum diyor ve silmeye çekiniyorsanız küçük bir kontrol sonrasında sorun olmadığını teyit ettikten sonra aynı şekilde devam edersiniz.

Öncelikle giriş yapmış iseniz çıkıs yapın ve sitenize öyle bakın. Eğer herhangi bir eskiye dönme yada yaptığınız bir değişikliğin olmadığını farkederseniz o zaman eklentileri komple kaldırırsınız. Bunun haricinde sorun olmadığında aynen güvenle devam edebilirsiniz.

Başıma gelen bir olay yüzünden bu yazıyı yazıyorum: kuaza.com sitemde kuazahaber son versiyon temayı kullanıyordum. Bir gün arkadaşımın bilgisayarından girdiğimde sitede orjinal tema görünüyordu. Şaşırtıcı değilmi. Eve gelince yeni tema, başka bir yerde de eski tema görünüyor :D

Bunun üzerine sorunu anlama çalışırken bütün eklentileri pasif yapıp tekrar denedim ama sonuç aynıydı. Sonra farkettim ki bir bilgisayarda üye girişi yapmışım diğerinde ise misafir konumundayım. Kendi bilgisayarımda üye çıkışı yaptığımda eski temanın bende de göründüğünü farkettim ve bunun akabinde cache eklentilerinin bu tarz bir özelliği aklıma geldi. Direk sadece cache eklentisini pasif yapıp üye girişi yaptığımda başarılı oldum.

Bunun kullanılmayan eklentilerin ne kadar zararlı olabileceğini anlatmak istedim. Seyir halinde sağdan devam…

Kategoriler
Wordpress faydalı kodlar

WordPress SQL cache uygulamasi – YENI

Daha once burada paylastigim uygulamanin daha basit, daha hizli ve stabil versiyonunu paylasacagim arkadaslar. Aslinda bunu daha once yazmayi dusunuyordum ancak yogun is temposu, yorgunluk, yogunluk v.s derken epey bir gecikmeme neden oldu.

Bu uygulamanin faydalarindan bahsedeyim biraz:
File cache uygulamalarindan daha iyidir.
Mysql ile cache tuttugumuz icin daha verimli ve daha hizlidir.
sisteminizdeki yuksek sorgulu alanlari hedef aldigimiz icin sorgu sayisinda buyuk bir dusus gosterir.
500 sorguyu 2 sorguya indirgeyebilir, sitenin hizini salise bazina kadar cekebilir.
kullanmazi, ozellestirilebilmesi kolaydir.

Daha onceki yazimda wordpress in options tablosunu kullanarak cache ye alacagimiz alandaki bilgileri yedekliyorduk. Ancak bu sefer uygulama alanindaki fonksiyonumuzu degistiriyoruz ve wordpress in bu ise uygun diger bir fonksiyonunu kullaniyoruz: get_transient

Bu seferki kod kalibimiz cok kucuk ve uygulanabilirligide cok kolay. Bunun icin asagidaki kodlara bakabilirsiniz:

$cache_ismi = "sidebarcache";
$cache_zamani = 60 * 10; // 60*10=600 buda 10 dakikaya esittir heralde :)

// Cache varmi yokmu kontrolunu yaptiriyoruz. eger yoksa sorgu yaptirip, ciktiyi DBye kaydeiyoruz.
if(false === get_transient($cache_ismi)){
ob_start();

/******* Cache Alinacak sorgular, kodlar v.s... *******/

// Burda ciktiyi DB ye kaydediyoruz..
set_transient($cache_ismi, ob_get_contents(), $cache_zamani);
ob_end_flush();

// Eger cache varsa DBden bilgileri cekip ekrana yazdiriyoruz.
}else{

// Echo ile DBdeki cache bilgilerini ekrana yazdiriyoruz.
echo get_transient($cache_ismi);
}

Kod kalibimiz yukardadir, goreceginiz gibi bir onceki makalemdekinden cok kolay, cok basit ve uygulanabilirligi cok kolaydir. Ozellikle kisa ve kucuk olmasi isimizi daha cok kolaylastiriyor.

Bu kod kalibini birden fazla alanda kullanabilirsiniz. Bunun icin cache_ismi kismini her alan icin degistirmeni yeterli olacaktir. yinede yapmaniz gerekenleri kisaca aciklayayim, daha onceki makalemde anlamayan arkadaslar vardi.

Oncelikle kod kalibinda goreceginiz en bastaki bu alani cache alacagimiz alana gore duzenleyin:

$cache_ismi2 = "cache2";
$cache_zamani2 = 60 * 10; // 60*10=600 buda 10 dakikaya esittir heralde :)

daha sonra asagidaki isimlerini duzenledigimiz alanlari guncelleyelim:

// Cache varmi yokmu kontrolunu yaptiriyoruz. eger yoksa sorgu yaptirip, ciktiyi DBye kaydeiyoruz.
if(false === get_transient($cache_ismi2)){
ob_start();

/******* Cache Alinacak sorgular, kodlar v.s... *******/

// Burda ciktiyi DB ye kaydediyoruz..
set_transient($cache_ismi2, ob_get_contents(), $cache_zamani2);
ob_end_flush();

// Eger cache varsa DBden bilgileri cekip ekrana yazdiriyoruz.
}else{

// Echo ile DBdeki cache bilgilerini ekrana yazdiriyoruz.
echo get_transient($cache_ismi2);
}

Son olarak kod icindeki bu alana cache alinmasini istediginiz kodlari ekleyin:
/******* Cache Alinacak sorgular, kodlar v.s... *******/

Bunlardan sonra islemi basari ile gerceklestirmis olacaksiniz. Daha net anlayabilmeniz icin basit bir sidebar.php dosyasindaki kodlari cache almayi gosterecegim. Boylece sidebarda istediginiz kadar bilesen kullanabilirsiniz, cunku sorgu sayisi ciddi anlamda optimize edilecektir.

Ornek sidebar.php icin wordpress in default temasi olan Twenty_Ten temasinin sidebar.php dosyasini ela alacagim. Ornek sidebar.php dosyasi asagidaki gibidir:

< ?php /** * The Sidebar containing the primary and secondary widget areas. * * @package WordPress * @subpackage Twenty_Ten * @since Twenty Ten 1.0 */ ? >

< ?php /* When we call the dynamic_sidebar() function, it'll spit out * the widgets for that widget area. If it instead returns false, * then the sidebar simply doesn't exist, so we'll hard-code in * some default sidebar stuff just in case. */ if ( ! dynamic_sidebar( 'primary-widget-area' ) ) : ? >
< ?php get_search_form(); ? >
< ?php _e( 'Archives', 'twentyten' ); ? >

< ?php wp_get_archives( 'type=monthly' ); ? >

< ?php _e( 'Meta', 'twentyten' ); ? >

< ?php wp_register(); ? >

< ?php wp_loginout(); ? >
< ?php wp_meta(); ? > < ?php endif; // end primary widget area ? >
&nbsp;

< ?php // A second sidebar for widgets, just because. if ( is_active_sidebar( 'secondary-widget-area' ) ) : ? >
< ?php dynamic_sidebar( ‘secondary-widget-area’ ); ? >
&nbsp;

< ?php endif; ? >

Simdi bu kodlara benim yukarida ekledigim kalip kodunu uyguluyorum ve asagidakileri elde ediyorum:

< ?php /** * The Sidebar containing the primary and secondary widget areas. * * @package WordPress * @subpackage Twenty_Ten * @since Twenty Ten 1.0 */ /* EKLEDIGIM BIRINCI KISIM BASLANGIC */ 
$cacheSIDEBAR = "cacheSIDEBAR"; 
$cache_zamani = 60 * 10; // 60*10=600 buda 10 dakikaya esittir heralde :) 

// Cache varmi yokmu kontrolunu yaptiriyoruz. eger yoksa sorgu yaptirip, ciktiyi DBye kaydeiyoruz. 
if(false === get_transient($cacheSIDEBAR)){ 
ob_start(); 
/* EKLEDIGIM BIRINCI KISIM BITIS */ ? >
< ?php /* When we call the dynamic_sidebar() function, it’ll spit out * the widgets for that widget area. If it instead returns false, * then the sidebar simply doesn’t exist, so we’ll hard-code in * some default sidebar stuff just in case. */ if ( ! dynamic_sidebar( ‘primary-widget-area’ ) ) : ? >

  • < ?php _e( ‘Archives’, ‘twentyten’ ); ? >

    < ?php wp_get_archives( ‘type=monthly’ ); ? >

  • < ?php _e( ‘Meta’, ‘twentyten’ ); ? >

    < ?php wp_register(); ? >

    • < ?php wp_loginout(); ? >

< ?php wp_meta(); ? > < ?php endif; // end primary widget area ? >

&nbsp;

< ?php // A second sidebar for widgets, just because. if ( is_active_sidebar( 'secondary-widget-area' ) ) : ? >
< ?php dynamic_sidebar( ‘secondary-widget-area’ ); ? >
<?php endif; 
/* EKLEDIGIM IKINCI KISIM BASLANGIC */ 
// Burda ciktiyi DB ye kaydediyoruz.. 
set_transient($cacheSIDEBAR, ob_get_contents(), $cache_zamani); 
ob_end_flush(); 
// Eger cache varsa DBden bilgileri cekip ekrana yazdiriyoruz. 
}else{ 
// Echo ile DBdeki cache bilgilerini ekrana yazdiriyoruz. 
echo get_transient($cacheSIDEBAR); } 
/* EKLEDIGIM IKINCI KISIM BITIS */ ?>

Ekleme yaptigim yerleri gorebilirsiniz. Suanda bu sidebar dosyasinin yapacagi sorgu sayisi 1 yada 3 u gecmeyecektir. Ne kadar sorgu olursan olsun, isterse 500-1000 sorgu sonunda cacheye aldigindan sonraki belirledigimiz sure icinde her giren kisi sadece sisteme 2-3 sorgu bindirecektir. Buda wordpressin hostu yordugundan sikayetci arkadaslar icin bulunmaz bir nimet olacaktir :)

Yeni yazi eklendiginde yada duzenlendiginde CACHE temizleme (otomatik)
Sitenize yeni yazi eklediginizde yada bir yaziyi guncellediginizde cachelerin bosaltilmasini ve yeniden guncel hali ile cache alinmasini kolaylastirmak icin functions.php dosyasina asagidaki kodlari ekleyin:

function kuaza_cachesilhepsini(){
delete_transient( 'CACHE1' );
delete_transient( 'CACHE2' );
delete_transient( 'sidebarCACHE' );
}


add_action('publish_post', 'kuaza_cachesilhepsini');
add_action('update_post', 'kuaza_cachesilhepsini');
add_action('delete_post', 'kuaza_cachesilhepsini');

Bu kodlar ne is yapar?: sitenize yeni yazi eklediginizde, duzenlediginizde yada sildiginizda ALINAN CACHE iceriklerini temizler. Boylece yeni yazi ekledikten sonra sitenize girenler yeni yazilarinizi cache suresinin bitmesini beklemeden gormus olurlar.
Kullanimi ise basitdir!: delete_transient( ‘CACHE1’ ); seklinde eklediginiz cache isimlerini sirasi ile alt alta ilk fonksiyona ekleyin. Bu kadar. eklediginiz cache isimleri ile eslenen cache icerikler: yeni yazi yazildiginda, silindiginde yada guncellendiginde silinecektir.

Bu eklemenin gerekli olabilecegini dusundum, cunku cache suresini 24 saat belirten arkadaslarin bu caheleri bosaltmazi icin DB ye girmesi gerekecektir. Bu yeni eklemem ile bu dertden kurtarmis oluyorum sizi. Bu yuzden degerimi bilin :)

Konuyu kavrayabilmeniz icin detaylara onem verdim, yoksa cok kucuk bir kod kalibidir, onceki makale gibi anlamayanlarin cikacagini zannetmiyorum ama yinede anlamayan arkadaslar olursa yorum yapmalari yeterlidir, her konuda yardimci olmaya calisacagim, hor gormeyecegim :D

Kategoriler
Php uygulamalari Php ve mysql Webmaster yardım

Php ile sql cache uygulamasi: Sisteminizi rahatlatin, sitenizi hizlandirin!

Sql cache, file cache ile nerdeyse ayni mantiga sahip bir php cache uygulamasidir. Tek farki sql cache verileri disk uzerinde degil mysql tablolarinda tutmasidir. Bunun file cache’ye gore bir cok artilarinin oldugunu dusunuyorum. Cunku bazi olumsuz durumlar file cache yapisinin iyi sekilde calisamamasina neden oluyor. Ornegin kullandiginiz hostun yada sunucunun disk yapisinin veya yazma hizinin dusuk olmasi cache sirasinda yavaslamalar ve optimasyon sorunlari yasamasina neden olur. Ozellikle SATA diskler uzerinde bu biraz daha gozle gorulur derecede kendini hissettirmektedir. SSD ve sas disk yapilari file cache icin en uygun olanlari ancak bunun eksikliginde sizlere sql cacheyi tavsiye edecegim. Mysql yapisi hizli islem yapmaya cok musait, file cacheden daha hizli ve aktif sekilde kullanim alani yaratir size.

Normalde localhostda sql cache yazisi icin denemeler ve testler yapiyordum, bunun icin bir kalip hazirladim, bu kalibi kullanarak birden fazla alan icin cache olusturabilirsiniz. Hazirladigim kalipda sadece cache alinacak alanin ismi ve cachede bekletilecegi suresini girmeniz yeterli olacak. Ve cache alinacak alanida belirttikten sonra hic ellemeden zamani geldiginde o bolum kendini guncellemis olacak. Mantik olarak cache alinan alanin ne kadar cachede kalacagi ve ne kadar ayni sorgunun gosterilecegini belirtebiliyoruz. boylece cache almadan onceki 50,100lerce sorguyu tek sorguya indirgemis olacagiz.

Uygulama iki bolumden olusuyor:

1: Fonksiyon bolumu, sizin duzenlemenize gerek olmayan bolum.

2: Cache icin kullanacaginiz kalip kod yigini.

Anlatima baslarken bunun biraz karisik gelebilecegini ancak mantik yuruttugunuzde gayet basarili bir calisma oldugunu anlayacaksiniz. Ayni tarz sistemi ayri tablo acmadan, sadece hazirladigim kod yiginini kullanarak wordpress de de istediginiz alani (buyuk sorguya neden olan yerleri) cache ye alabileceksiniz ki bu wordpress icin olan dokumani bir sonraki yazimda yazacagim.

Oncelikle kodu uygulayacaginiz sayfada mysql baglantisinin saglanmis olmasi gerekli, eger mysql baglantisi saglanmamis ve yeni basliyorsaniz asagidaki mysql baglanma kod yapisini kullanabilirsiniz, tabi oncesinde bu islem icin database olusturmaniz gerekli, yada var olan databaseye baglanti acmaniz gerekli asagidaki kod ile:

$conn = mysql_connect("localhost", "KULLANICI", "SIFRE");

if (!$conn) {
echo "baglantida sorun var: " . mysql_error();
exit;
}

if (!mysql_select_db("DATABASE")) {
echo "kullanilamiyor bu database: " . mysql_error();
exit;
}

Kendinize gore duzenlemeyi unutmayin.

Bu islemin hemen ardindan cache verilerini tutacagimiz tablomuzu mevcut databasemize eklememiz gerekli. Asagidaki kodu phpmyadmin den sorgu kismindan uygulayin:

CREATE TABLE IF NOT EXISTS kuaza_sqlcache (

id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
cache_ismi varchar(64) NOT NULL DEFAULT '',
cache_icerik longtext NOT NULL,
cache_zamani varchar(30) NOT NULL DEFAULT '',
cache_suresi int(10) NOT NULL DEFAULT '60',
PRIMARY KEY (id),
UNIQUE KEY cache_ismi (cache_ismi)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

Sorguladiginiz bu tabloya cache alanlari icin bize gerekli olan bilgileri kaydedecegiz, ve tekrar sonrasinda ekrana yazdiracagiz.

Simdi sira fonksiyonlarimiza geldi. Normalde fonksiyonlari kullanmamistim testlere ilk basladigimda, ancak hem kolaylik saglamasi hemde yeni arkadaslarin fonksiyonla olan baglarini guclendirmek adina boyle bir yol sectim. Hemde cache alacagimiz kalip kod yigini daha temiz ve sade bir duruma geldi. yinede bunu yazdigima bakmayin, anlayanlar icin basit, anlamayanlar icin biraz fazla gorunebilir :)

Bu fonksiyonlari ister ayri sayfadan, istersenizde cache alacaginiz sayfada bir yere ekleyin. Eger coklu bir sistemde calisiyorsaniz her sayfaya include ettiginiz belli dosyalariniz vardir, bu include ettiginiz dosyanin icerisine eklemeniz daha mantikli olacaktir.

/* Cache kontrol alani, buradan once kontrol yaptirip, sonrasinda gerekli islemlere baslayacagiz. */
function c_cachekontrol($cacheismi,$bilgiiste=""){
$sorgu=mysql_query("select cache_ismi,cache_icerik,cache_zamani,cache_suresi from kuaza_sqlcache where cache_ismi = '$cacheismi'");
$bilgi = mysql_fetch_array($sorgu);
if($bilgi > 0)
{
if($bilgiiste == "cache_zamani"){
return $bilgi["cache_zamani"];
}elseif($bilgiiste == "cache_suresi"){
return $bilgi["cache_suresi"];
}elseif($bilgiiste == "cache_icerik"){
return $bilgi["cache_icerik"];
}
}else{
return "tabloyok";
}
}

/* eger mysql tablomuz yoksa yeni tablo ve cache alinan kodlari tabloya yazdiracagiz,
boylece sonraki calistirmamizda bu kaydettigimiz tablodan cache alinacak.
*/
function c_yenicacheac($cacheismi,$cacheicerik,$cachesuresi="60"){
$alhepsini = $cacheicerik;
$zaman = time();
$yeniekle = mysql_query("INSERT INTO kuaza_sqlcache
(cache_ismi, cache_icerik, cache_zamani, cache_suresi)
VALUES ('$cacheismi', '$alhepsini', '$zaman','$cachesuresi')");
/*
Bu alanida sorgunun gerceklesip gerceklesmedini arka planda yani kullanici arayuzunde gostermeden ekrana basiyoruz.
Bunu gormek icin kaynak kod kismina bakmaniz yeterli olacaktir.
*/
if($yeniekle) {
return "";
} else {
return "";
}
}

/* Eger cache suresi belirledigimizden eski ise bu alan ilede varolan cache alanini guncelliyoruz. */
function c_cacheguncelle($cacheismi,$cacheicerik,$cachesuresi="60"){
$alhepsini = $cacheicerik;
$zaman = time();
$guncelle = mysql_query("UPDATE kuaza_sqlcache SET cache_icerik = '$alhepsini', cache_zamani = '$zaman', cache_suresi = '$cachesuresi' WHERE cache_ismi = '$cacheismi'");
/*
Bu alanida sorgunun gerceklesip gerceklesmedini arka planda yani kullanici arayuzunde gostermeden ekrana basiyoruz.
Bunu gormek icin kaynak kod kismina bakmaniz yeterli olacaktir.
*/
if($guncelle) {
return "";
} else {
return "";
}
}

Kod icerisinde ki alanlari anlayabileceginiz sekilde yorumlamaya calistim.

Simdi ise en can alici noktaya geldik diyebilirim. Cache almamizda bize en cok yardimci olacak alanlardan birisi, kalip kod yigini alanina geldik. Bunu sisteminize entegre etmeyi basardiginiz,da sonraki uygulamalarda zorluk cekmeyeceginize eminim. Bir kere yapan, sonraki eklemelerde zorlanmayacaktir.

Kod icerisinde gerekli aciklamalari yaptim, ancak sonrasinda da olayi daha iyi kavrayabilmeniz icin onemli bolumleri detayli sekilde yazacagim:

/*
cacheye alacaginiz bolum icin bir isim girin, 
boylece birden fazla alani cache alacaginizda farkli isimlerle 
yeni alanlar acabilirsiniz.
*/
$cacheismi = "cachedeneme4"; 

/*
Cacheye aldiginiz kodlarin ne SIKLIKLA yenilenecegini,
guncellenecegini buradan belirtebilirsiniz. Dakika cinsinden bir sayi girmeniz yeterli.
5 = 5 dakika, 60 = 1 saat.
*/
$cachesuresi = "160";

/*belirledigimiz cache ismini kontrol ettiriyoruz, varsa sonraki islemlere geciyoruz, yoksa yeni alan girip cache bolumu olusturuyoruz.*/
$bilgi = c_cachekontrol($cacheismi);

/* if ile daha once cache tablosunun acilip acilmadigini kontrol ediyoruz, eger tablo var ise sonraki adima geciyoruz. */
if($bilgi != "tabloyok"){

/* Buradan bize yardimci olacak cache zamanini ve belirlediginiz suresini aliyoruz. */
$db_cache_zamani = c_cachekontrol($cacheismi,"cache_zamani");
$db_cache_suresi = c_cachekontrol($cacheismi,"cache_suresi");

$cachetime = 60 * $db_cache_suresi; // 60 ile belirledigimiz cache suresini carparak suanki zamandan cikartacagiz, bir sonraki adimda.

/* 
if ile cachelenen icerigin zamanini hesapliyoruz ve 
daha once belirttigimiz dakikadan daha az ise (yani cache zamani icerisinde ise) cache zamani, 
direk cacheli alani ekrana yazdiriyoruz.
*/
if (time() - $cachetime < $db_cache_zamani) {

# cache belirttigimiz zaman icerisinde ise ekrana bastiriyoruz. Boylece tek sorguda hersey halletmis olduk.
echo unserialize(base64_decode(c_cachekontrol($cacheismi,"cache_icerik")));
echo "";
}else{
/*Eger cachenin suresi belirledigimiz dakikayi asmis ise, 
o zaman burdan yeniden normal kodlarimizi calistiriyoruz ve 
cache alanini guncellemesini sagliyoruz. */
ob_start();




// Cachelenecek kodlar ve sorgular alani (aynisi)





/* Ekrana basilan alanin kodlarini html alarak, var olan tabloyu yeniden guncelliyoruz. */
 echo c_cacheguncelle($cacheismi,base64_encode(serialize(ob_get_contents())),$cachesuresi); 
 
 ob_end_flush();
 }
 /* Zaman kontrol if fonksiyonu alani bitti, daha once actigimiz ve 
 tablo var yok kontrolu yaptigimiz if icin else alanina geciyoruz
 */

 }else{
 /* Eger sql cache alaninda belirledigimiz isimde bir cache alani yoksa, 
 buradan kodlarin html yapisini alarak yeni cache alanini ekliyoruz. 
 */
 ob_start();




// Cachelenecek kodlar ve sorgular alani (aynisi)





/* Alinan html kodlari yeni eklenecek tablomuza ekliyoruz. */
 echo c_yenicacheac($cacheismi,base64_encode(serialize(ob_get_contents())),$cachesuresi); 

 ob_end_flush();
 }
 /* Ve gerekli if kontrolleri bitti, yaptigimiz sorgu sayilari 1000 ken 2 oldu, hayirli olsun :) */

Kodlarin icerisinde butun alanlarin ne islem ve ne fonksiyon gorevi gordugunu belirttim.

Yinede unutmamaniz gereken kalip kod yigini alanindaki “Cachelenecek kodlar ve sorgular alani (aynisi)” kismi ikiside ayni olacak, yani bu alana cache alinmasini istediginiz sorgularinizi, kodlarinizi girmeniz gerekli. Genelde yuksek soegular oluyor, 50,60 sorgu gibi, o zaman buradaki uygulama ile sorgu sayisi 2 ye kadar dusecektir. Boylece gerek acilislarda olsun, gereksede sonraki sayfa gezintilerinde sitenizde gozle gorulur hizlanma olacaktir. bunun yaninda sunucunuzu yada hostunuzu rahatlatmasida cabasi :)

Bu uygulamanin faydasi bir tek mysql sorgularinda olmuyor arkadaslar, sistemi zorlayacak php sorgularinda veya fonksiyonlarinda da cache alma islemi uygulandigi icin ciddi derecede sisteminizi rahatlatacaktir.

Sitenizin hizlanacaginida hesaba katarsaniz hem kullanici sitenize girdiginde keyifli zaman gecirir, hemde arama motorlari icin cazip bir alan haline gelir. Guncellik konusuna deginmiyorum, orasi size bagli. Ancak hic bir kullanici, siz bile bir sayfanin acilmasini 5 saniye beklemek istemezsiniz :)

Uygulamayi gelistirmeye yetecek zamanim olursa el atar arada bir yenilikler eklemeye calisirim, bunun haricinde gelistirme amacli kodlari kullanacak arkadaslara simdiden basarilar diliyorum. Anlamadiginiz bir yer olursa konu altindan yorum ile beni uykumdan edip, pc basina cagirabilirsiniz.

Sevgiyle kalin, bol kodlu gunler :)

Kategoriler
Webmaster yardım

Mysql Optimizasyonu ve Query Cache Çalıştırmak – 1

Bazi durumlarda sunucumuz artik var olan sitelerin bindirdigi yuku kaldirmamaya baslayacaktir. Yukselen hitler, kullandigimiz script’in hatalari, sql sorgulari v.s derken bi bakmissiniz siteleriniz ayvaslamaya, sunucunuzda zorlanmaya baslamis. Sunucu optimizasyonu yapmaniz gerektiginde ilk oncelik cok fazla sql sorgusu kullaniyorsaniz eger mysql uzerinde olmalidir. Genel olarak mysql yi 1-2 gun boyunca inceleyip size sonuc dondurecek ve saglikli my.cnf ayarini verecek gerekli eklentiler mevcut ancak buna 2. seride deginecegim. Suanda basit yoldan sitelerimizde kullanilan sql sorgularini cache etmek icin mysql nin bir ozelligini acmayi gosterecegim..

Mysql optimizasyonu icin sunucunuzda bulunan my.cnf dosyasini kullanmamiz gerekli. Genelde default olarak icerisinde bir kac ayar mevcuttur, ancak bu standart oldugu icin ilerde sitemizin yukunu kaldiracak duzeyde malesef olamiyor. Cunku kullanilan script cok fazla sql sorgusu iceriyorsa siddetle SQL CACHE ayarlarini acmanizi tavsiye ederim. Bu Hem sitenizin acilisinda, hemde kullanirken bir hiz kazandiracagi gibi, sunucuda agirlasan yukun birazini sirtlayacaktir..

Oncelikle bu uygulamayi yapabilmeniz icin sunucu sahibi olmaniz gerek ve ssh baglanti izniniz olmali.. Baslamadan once duzenleme yaptiginiz dosyalari yedeklemeyi unutmayin.

Sunucumuzdaki my.cnf dosyasini aciyoruz. Bu genelde asagidaki yolda bulunur:
/etc/my.cnf (centos, cpanel ve plesk’de denenmistir)

bu dosyayi actiginizda icerisi bos ise yada belli kodlar varsa siz fazla kurcalamadan asagidaki kodlari [mysqld] sekmesinin altinda bir yere ekleyin:

thread_cache_size = 128
key_buffer = 256M
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 4M
table_cache = 1000

Cok fazla tablolu siteleriniz varsa table_cache = 1000 kismindaki sayiyi artirmanizi oneririm yada az ise azaltmanizi..

Bu ayarlari kendinize gore duzenleyebilirsiniz. Genelde her sunucu ayni ozelliklerde olmuyor. Eger ram ve sunucu ozelliginiz cok dusuk ise verilen limitleri dusurebilirsiniz. Ancak oncesinde sql cachede etkili olan kisimlarin aciklamasini yapmamiz gere, bundan sonrasinda mantikli sonuclar ile sunucunuza goze duzenleme yapabilirsiniz.

“key_buffer = 256M” kismi, Myisam index blokları icin kullanilir. Gelen istekler disk yerine hafizadan saglanir.

“query_cache_type = 1” kismi, cache’i açtığımızı belirtir. 0 yapınca kapatmis oluyoruz, ancak biz suanda 1 yaparak bu ozelligi aciyoruz.

“query_cache_limit = 4M” kismi, cachelenecek maximum sorgu limitini belirler, 4mb’a kadar olan sorgulari cache alarak hafizasinda tutar.

“query_cache_size = 128M” kismida toplamda cachelenecek dosyalar icin sunucuda kullanilacak maximum alani ifade eder. Artirabilirsiniz, yada dusurebilirsiniz..

“table_cache = 1000” kismi, tablolarin acilmasini ve okunmasini hizlandirmak icin daha once acilan tablolar icin cache olusturmasidir. Myisam tablo yapısında tum tablolar sorgu seklinde sunucuda tutulmaktadir, bunlarin acilip okunmasi gibi islemler icin cacheyi acmak bu sureyi daha hizlandiracagi icin faydasini gosterecektir..

Kullandiginiz sisteme gore inceleme yaparak my.cnf ayarlarini ozellestirebilirsiniz. Bunun icin onerecegim bir yolda hatali ve sorunlu sql sorgularini ogrenmektir. Bunun icin my.cnf dosyasina asagidaki kodlari ekleyerek verilen yolda toplanan hata loglarini inceleyip sorunlu sorgulari ogrenebilirsiniz:

log_slow_queries=/var/log/slow-queries.log
long_query_time=10
log-queries-not-using-indexes

Sonrasinda sorunlu sorgular icin scriptlerinizi optimizasyonudan gecirebilirsiniz.. Simdilik bu kadar yazinin diger serilerinde optimasyon hakkinda kullanilan terimler hakkinda da bilgi verecegim. Gerek kullanici tarafli yazilimlar, gerekse kullanilan scriptler hakkinda da optimasyon onerilerim olacak. Simdilik kolay gelsin..

Orjinal Kaynak…

Kategoriler
Deneme Yazıları Eğitim - öğretim İnternet Dünyası Ivır Zıvır Php fonksiyonlari

Cache sisteminizi kendiniz hazirlayin! [PHP]

Konunun detaylarina baslamadan once webmaster arkadaslara bir kac goudum ve nasihatim olacak. Haddim olmayabilir ancak bunu bir nevi dikkate almaniz hepinizin yararina olacaktir.

Webmaster: Bir script kodlarken, hazirlarken mumkun oldugunca sorgu sayisini kisitli tutun yada bu tarz sistemlerde hava, su kadar degerli olan cache sistemlerini kullanin. Yoksa kendini hazirlayin. Bir kac mantikla yapilmayacak sey yoktur.

Alici: Bir script alirken, dikkat edin, yaptigi sorgu sayisi baslarda farkedilmeyecek kadar az olabilir, ancak yuksek hitlerde sunucunuz dahi dayanamayacak noktaya gelecektir. Ya kilitlenecek yada is yapamaz halde yavaslayacaktir.

Yanlis kodlama, php’nin urettigi hata kodlari, yuksek boyutlarda sorgu sayisi, mysql sorgularindan bahsediyorum, baslarda hitiniz 10-20 kisiyken farkedilmezdir. ancak hitiniz 500-1000 tekil e ciktiginda, anlik olarak gelen her kisi scriptteki hatali kodlari tekrar calistiracaktir, yada cok fazla sorgu varsa her kiside ayri sorgu sayisi ortaya cikacagindan sunucunuz, hostunuz kisa surede susptende olur, yani kapanir.

Buna ornek vermek gerekirse sistemine asina oldugum wordpress i secmek istiyorum: WordPress sistemini aslinda herkes yuksek hitlerde sistemi kastigi, zorladigi, kilitledigi sekillerde bilirsiniz. Aslinda oyle degildir. Standart wordpress temasinda ana sayfa sorgu sayisi 25 lerde iken, prof. bir magazine temasinda bu sayi 150-200 lere kadar cikar.. bu ornektir, 50 de olur, 100 de. Burada anlik hitiniz 50 ise sunucunuz aninda kilitlenecektir, yada inanilmaz bir yavaslama olacaktir. sebebi ise cok fazla sorgu sayisi ile hem apache ye, hemde apacheden cok mysql programina yuklenmeniz. sonucunda bunu makine kaldiramaz ve kilitlenir. sitenize bir sure ulasilamaz.

Bu kadar uzun bir baslangic yazmamin sebebi, konuyu daha iyi kavrayabilmeniz arkadaslar. Yuksek sorgular hostu oldurur, o olurkende siz bitersiniz.. Bunu dedigim gibi baslarda anlamazsiniz, ama ilerde cok kotu sekilde hissedersiniz..

Yakin zamana kadar bende bu konuda sorgu azaltma calismalari yapiyordum, ancak cache sistemi bu konuda tam aradigim seydi. sitenize giren bir kisi 200 sorgu varsa temada onu calistirir, sonrasinda cache ile sayfa komle cacheye alinir. sonrasinda girenlerin hepsi sorgu calistirmaz, cache edilen HTML dosyasini calistirir. Bu sekilde anlik 50 kisi varsa 50 kiside HTML bir dokuman calistiracaktir, yani mysql ye yuklenmede %85 e varan dususler olacaktir. Bu sitenizin guncelligine gore degisir, cok az guncellenen bir siteniz varsa cache sistemi sizin can damariniz olacaktir.

Yuksek sorgulu temalardan birisi de KuazaHaber temasidir. bunu farkettigimde sorgu azaltma yoluna gittim, bu seferde tema temaliktan cikmak uzereydi, neden cache denemeyeyim diye icimden gecirdim. Hali hazirda cache eklentileri istedigim gibi degildi, sistemi kasmasinin yaninda pekde gozle gorulur bir faydasini farkedemedim ben.

Sonuc olarak 150 ye varan sorgu sayisi cache sistemi sayesinde 11 e dustu. Bu 11 sorguda sitenin en ust kismindakiler, menuler. ondan asagisini cache ile sayfaladigim icin her giren HTML olarak bunu goruyor, ve sorgu yapmiyor sunucumuza..

Tamam kuaza uzatma dediginizi duyar gibiyim, yukarida yazdiklarimi kavradiginizi umid ederek asil konumuz olan sisteminizi cache ile kurtarabileceginiz konuya giriyorum..

CAche sistemine giris:

Cache kodlari 2 kisimdan olusur.

  1. kisim en ustte cacheye alinan, baslanan yer.
  2. kisim cachenin kapatildigi yer.

eger cache ile calisiyorsaniz 2. kisimdan sonrasini sitede gosteremeyeceginizi bilmenizi isterim. bu sebeple mantik kullanarak kendi sisteminizi gelistirebilirsiniz

Yani daha kolay anlayabilmeniz icin bir ornek vermek istiyorum:

<Cache kodlari>

kodlariniz, sorgulariniz

</cache kodlari>

bu sekilde kodlarinizi yerlestirdiginizde aradaki sorgular cache ye alinir. En guzelide cache ye sure koyabiliyorsunuz. yani cache edilen dosya 15 dk dan eski ise yenisi ile degistirilir.

ben size dakikali olarak cache alma kodlarini paylasacagim, sonrasinda aciklamasini yapacagim, dikkatle takip edin:

Cache ust kisim kodlari:

$cache_dosyasi= “kuaza_anasayfa”;
$cachefile = “cache/”.$cache_dosyasi.”.html”;
$cachetime = 60 * 60; // 60 * 60 = 1 saat
if (file_exists($cachefile) && (time() – $cachetime < filemtime($cachefile))) {
include($cachefile);
echo “<!– Kuaza onbellek sistemi “.date(‘jS F Y H:i’, filemtime($cachefile)).” –>n”;
exit;
}
ob_start();

yukaridaki kod dan sonras cache almak istediginiz kodlar geliyor.

en alt kismida asagidakileri ekleyerek cache leme islemi icin sayfa araligimizi belirliyoruz:

Cache alt kisim kodlari:

$fp = fopen($cachefile, ‘w’);
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush();

Iki kodu birlestirerek bir ornek vermek istiyorum. Eminim sonrasinda mantigi anlamis olursunuz:

$cache_dosyasi= “kuaza_anasayfa”;
$cachefile = “cache/”.$cache_dosyasi.”.html”;
$cachetime = 60 * 60; // 60 * 60 = 1 saat
if (file_exists($cachefile) && (time() – $cachetime < filemtime($cachefile))) {
include($cachefile);
echo “<!– Kuaza onbellek sistemi “.date(‘jS F Y H:i’, filemtime($cachefile)).” –>n”;
exit;
}
ob_start();

echo “kuazadan selamlar arkadaslar. bu echo ettigimiz yazi cache sistemi sayesinde cache klasorune html olarak kaydedilecek. burada php yada sql sorgularida kullanabilirsiniz, sizin gordugunuz sekilde cachelendigi icin sonraki acilmasinda sorgu degil html sayfa karsiniza cikacaktir :)”;

$fp = fopen($cachefile, ‘w’);
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush();

bu kodlari tabiki <? php …. ?> kodlari arasina almaniz gerek sonrasinda calistirdiginizda orta kisimda echo ettigimiz yazi daha acmis oldugunuz cache klasorune html seklinde yani bu isimde: kuaza_anasayfa.html kaydedilecektir.

bu islemin saglikli yapilabilmesi icin, oncelikle cache klasorunun chmod ayarinin 777 olmasi gerek.

Birazda kodlardaki alanlardan bahsedelim:

$cache_dosyasi= “kuaza_anasayfa”;

Yukaridaki alinti yaptigim kod kisminda kuaza_anasayfa ismini degiskene atiyoruz ve sonrasinda bunu cachefile degiskeni kisminda kullaniyoruz. Bunu bu sekilde eklememdeki sebep wordpress yada farkli bir scripte daha cabuk uyarlanabilmesidir. Girilen sitedeki get yada post methodu ile gelen bir veriyi alarak degiskene atarsiniz sonrasinda bunun isminde cache dosyasi yaratilir. sonraki zamanlarda ayni post yada get metodundan ayni bilgi gelirse cache dosyasi gosterilecektir. hayir farkli bir sey gelirse o isimde yeni bir cache olusturacaktir.

Ben bunu tam anlayabilmeniz icin wordpress den ornek vermek istiyorum: WordPress de yazi okuma sayfasina girdiginizde aslinda p=YAZI IDSI seklinde bir link olusur.. Siz buradaki p= den sonrasini get metodu ile cache kismana alip degiskenimize yazdirirsaniz, o yaziya ait cachemiz olmus olur. Sonrasinda girilen diger yazilar icinde o ID de farkli bir cache olusturacagi icin sitenizin cogu sayfasi cachelenecek ve gelen ziyaretciler size zarar degil, kar getirecektir..

Ornegin kendi sitem olarak hdvideoclip.com da ana sayfa ve video izleme kisimlarinda cache kullaniyorum, yukaida bahsettigim sekilde ve inanilmaz hizli aciliyor sayfalar. Sonucda sorgu olmadigi icin html sayfa aciliyor. Bu hem ziyaretciyi size baglar, hemde hostunuz, sunucunuz sorgu sayisinin fazlaligindan kasilmaz.

o sitede ornek bir videoya bakin: timbaland-scream-ft-keri-hilson-nicole-scherzinger-9319.html

acilisi nasil ? Turkiyede iseniz youtube yasak oldugu icin yavaslamalar olabilir, yada siz acarken biz saldiri aliyorsak yavas acilabilir. onun haricinde hizini gormenizi isterim.

sistem wordpress bu sebeple once o sayfanin ID sini degiskene atiyorum. Ornek:

$cache_dosyasi = $konuIDSI;

Sonasinda da bu sekilde kullaniyorum:

$cachefile = “cache/yazi-“.$cache_dosyasi.”.html”;

ve cacheye kaydetmesi bu sekilde oluyor: yazi-KONU IDsi.html

Cache dosyasinin ne kadar surede CACHE de kalacagini ise burada belirliyoruz:

$cachetime = 60 * 60; // 60 * 60 = 1 saat

10 dk da bir cache alsin istiyorsaniz bu sekilde yapin:

$cachetime = 10 * 60; // 10 * 60 = 10 dakika

Buradaki 60 = 60 saniyedir, yani 1 dakikadir. bu sekilde hesaplamanizi yapabilirsiniz.

sonrasinda da cacheden aldigimiz saat bilgisini belirledigimiz sure ile karsilastiriyoruz ve gecmis ise yeni cache almasini, gecmemis ise cacheyi gostermesini istiyoruz:

if (file_exists($cachefile) && (time() – $cachetime < filemtime($cachefile))) {
include($cachefile);
echo “<!– Kuaza onbellek sistemi “.date(‘jS F Y H:i’, filemtime($cachefile)).” –>n”;

Yukarida da yazdigim gibi, yukaridaki kod tarihleri ve saatleri karsilastiriyor, belirledigimiz dakikanin ustunde degil ise cacheyi gosteriyor, ustunde ise buradan tekrar basliyor cache almaya: ob_start(); ve buradan da bitiriyor: ob_end_flush();

Ben wordpress den ornek verdim, kullandiginiz her sisteme entegresi cok basit bir kod uygulamasidir bu. Bu kalibi kullanarak sizde sistemlerinizi Cacheleye bilir. Sunucunuzun rahatlamasini %50 ye varan performans artisini saglayabilirsiniz..

Bu cache uygulamasinin, hem size, hem hostinginize, hemde varsa sunucunuza yarari cok olacaktir. Bunun yaninda sitenizin arama motorlarinca daha cok indexlenmesine, hizli acildigi icin arama motorlarinin daha cok sitenizi ziyaret etmesine, hizli acildigi icin ziyaretcinin sitenize bir daha gelmesine ve daha bir cok konuya arti olarak etkisi vardir. Bu sebeple uyglarken, yada gelistirirken bildiklerinizi ogrendiklerinizi diger webmaster arkadaslarla paylasmayi unutmayin. Birbirimizin kuyusunu kasmak yerine bilgiyi paylastikca buyumeyi ogrenmenin vakti geldi sanirim..

Konuyu kapatmadan yukaridaki kodlar ile cache kullandigim sistemlere goz atarak sonucu gorebilirsiniz:

hdvideoclip.com: Ana sayfa ve video izleme kismi

makaleci.org: Ana sayfa ve haber okuma kismi

Farkli konularda yine yazacagim, simdilik esenlikle kalin..