Cuma, 18 Eylül 2009

Hook Tekniğiyle Web Sitesi Hızlandırma

 

CodeIgniter kendi çekirdek kodlarının değiştirilmeden müdahalesi için HOOK (kanca) opsiyonu düşünülmüştür. Böylece CodeIgniter kodlarını değiştirmeden müdahale etmemiz olanağı tanınmıştır. Bu opsiyonu, CodeIgniter çalışmasından önce veya sonra kanca atarak kendi kodlarımızla müdahale etme olanağı olarak düşünebiliriz.

Bu müdahalenin bir kaç adım için yapılmasına olanak verilmiştir. Bunlar:

  • Controller sistemi yüklenmeden önce
  • Controller dosyası yüklenmeden önce
  • Controller konstrüktör methodu yüklenmeden önce
  • Controller dosyası yüklendikten sonra
  • Ekrana içerik basmadan önce
  • Cache kullanılması durumunda ekrana içerik basmadan önce
  • İskele (scaffolding) yüklenmeden önce
  • Controller sistemi sona erdikten sonra

Amacımız ekrana basmadan önce HTML kodlarınında bulunan satırları, boşlukları almak kısacası HTML çıktısını sıkıştırmak olsun. Bunun için CodeIGniter`ın Ekrana içerik basmadan önce opsiyonunu kullanacağız. Önce application/hooks dizini altına kopyalayacağımız compress.php isimli dosyamızı yazalım:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

function compress()
{
 $CI =& get_instance();
 $buffer = $CI->output->get_output();
 
 $search = array(
     '/\>[^\S ]+/s', //strip whitespaces after tags, except space
     '/[^\S ]+\</s', //strip whitespaces before tags, except space
     '/(\s)+/s', // shorten multiple whitespace sequences
  '#(?://)?<!\[CDATA\[(.*?)(?://)?\]\]>#s' //CDATA haric olsun
  );
 $replace = array(
     '>',
     '<',
     '\\1',
  "//<![CDATA[\n".'\1'."\n//]]>"
  );
 $buffer = preg_replace($search, $replace, $buffer);

 $CI->output->set_output($buffer);
 $CI->output->_display();
}

Bu dosyada CodeIgniter kodlarını almak için kullandığımız get_instance() metodunun ardından ekran görüntüsünü $buffer değişkenine alıyoruz. Daha sonra regular expression cümlelerimiz ile Javascript kodlarının çalışmasını engellemeden, tüm gereksiz satırları ve boşlukları alarak ekran çıktısını temizliyor. Ardından output sınıfında set_output() fonsiyonuyla ile $buffer değişkenini hafızaya alıyor, sonra da display() fonksiyonuyla ekrana yazdırıyoruz.

Bu kod parçasında dikkat etmemiz gereken husus: HTML sayfamız içinde Javascript kodlarının başlangıç ve bitiş satırlarını aşağıdaki gibi işaretlememiz gerektiğidir. Javascript kodları içine `//´ işareti ile görüşlerimizi yazdıysak bunları da kaldırmamız gerekir. Çünkü, satırlar kesilip de kodlar tek bir satıra taşınırsa `//´ işaretinden sonraki kodlar çalışmayacaktır.

//<![CDATA[
 Javascript kodlarımız buraya yazılıyor. 
 Dikkat! Görüşlerimizi kod içine eklenmemesi gerekir.
//]]>

Bir sonraki adımda ise application/config dizini altına hooks.php isimli bir dosya yaratıyoruz. Burada CodeIgniter çekirdeğine attığımız kancanın tanımını yazıyoruz:

$hook['display_override'][] = array(
 'class' => '',
 'function' => 'compress',
 'filename' => 'compress.php',
 'filepath' => 'hooks'
 );

Yukarıdaki kodlar ile CodeIgniter`a display_override opsiyonunu kullandığımızı, fonksiyonumuzun adının compress olduğunu, compress.php dosyası içinde ve hooks dizini altına kayıtlı olduğunu söylüyoruz. Hooks dosyamızda display_override opsiyonunu kullandığımız için compress.php dosyamızda $CI->output->get_output(); cümlesi ile ekran çıktısını $buffer değişkenine çektiğimizi unutmayalım.

Son olarak yaptığımız bu değişikliği devreye almak için application/config dizini altındaki config.php dosyamızdaki enable_hooks değişkenini TRUE yapıyoruz:

$config['enable_hooks'] = TRUE;

Böylelikle CodeIgniter`da çekirdek kodlara nasıl müdahale ettiğimizden, HOOK metodundan kısaca bahsederek, ekran çıktımızı sıkıştırmış ve böylece sayfa açılış süremizi daha kısaltmış olduk. Bu makale, Jerome Jaglale`nin burada anlattığı kodlar geliştirilerek hazırlanmıştır.

Yorumlar

Merhaba , sorum yazıdan bağımsız olacak ama codeigniter fonksiyonlarını ve kısa açıklamalarını bulabileceğimiz bir sheet varmı acaba ? Yazarken ne yapılacağını biliyorsunuz ama nasıl yapacağınızı bilmediğiniz zaman çok zaman kaybına uğruyorsunuz.Teşekkürler

@Sadri: Bahsettiğin doküman halihazırda kullanım kılavuzunda mevcuttur. Buradan ulaşabilirsin.

Çok teşekkür ederiz..

Konuyla alakası yok ama burda "cache" geçince aklıma geldi, sitede uygun başlık bulamadım konuyla alakalı , sorum ; codeigniter içersinde cache sisteminin varoldugunu biliyorum , yani kodlar yeniden yorumlanmıyor bu sistem nerde nasıl çalışıyor , config'ten start etmemiz felanmı gerekiyor acaba , yoksa bu özellik fasonmu ?

@Ömer: CodeIgniter önbelleğe alma (caching) işlemi hakkında kılavuzda anlatılanlar sorularına cevap olacaktır.

Cevap için teşekkürler... Controller dosyasında yazıldıgı gibi aktif ediyorum fakat cache dizinine herhangibirşey düşmüyor , sanırım Smarty kullanmamdan kaynaklanıyor bu durum. Olabilirmi acaba ?, tecrube edindinizmi bu şekilde... Kolay gelsin...

Yorum Ekle