PHP Cikti Kontrol
Fonksiyonlari ve HTTP Basliklari
Cikti Kontrol fonksiyonlarinin PHP'ye eklenme sebebini ve
ne tur durumlarda bize
yardimci olabilecegini anlamak icin HTTP HEADER (baslik)'larinin
ne oldugu ve
nasil calistigi konusuna biraz deginmek gerekiyor.
HTTP HEADER (HTTP BASLIGI)
HTTP protokolu kullanilarak web sunucusuna yapilan her cagriya,
gonderilen cevap
her zaman iki bolumden olusur, baslik ve govde. Mesela web
surucumuzde 'ornek.txt'
adinda "Turkiye'nin en iyi PHP sitesi Turk-php.com !" seklinde
bir satir iceren bir
dosyamiz oldugunu varsayalim.
Web sunucumuzun bu dosyayi cagiran bir tarayiciya gonderecegi
cevap asagidaki gibidir.
HTTP/1.1 200 OK
Date: Sat, 02 Sep 2000 21:40:08 GMT
Server: Apache/1.3.11 (Unix) mod_macro/1.1.1 PHP/4.0.2-dev
Last-Modified: Sat, 02 Sep 2000 21:39:49 GMT
ETag: "12600b-e-39b173a5"
Accept-Ranges: bytes
Content-Length: 14
Connection: close
Content-Type: text/plain
Turkiye'nin en iyi PHP sitesi Turk-php.com !
Bu cevabin ustte kalan ilk kismi HTTP Basligidir. Kullanicilar
ustteki bu baslik kismini
gormeseler de, bu kisim icerik tipi, kullanilan protokol versiyonu,
dokumanin son guncellenme
tarihi ve benzeri gibi cok miktarda bilgi ihtiva etmektedir.
HTTP basliginin formati konusunda
cok fazla bir kural yoktur ve genelde satir basina bir tane
Alan Adi
: Deger
seklindeki ciftlerden olusur.
Burada en dikkat edilmesi gereken nokta HTTP Basliginin, Icerik
govdesinden bos bir satir ile
ayrilmis olmasi gerektigidir.
HTTP basligindaki bilgilere PHP fonksiyonlarini kullanarak
ekleme veya degistirme yapabilirsiniz.
Mesela bunu acik bir sekilde header () fonksiyonunu kullanarak
yapabilirsiniz:
header("Location: http://www.turk-php.com/"); // sayfayi yonlendir
HTTP basligini direk olmayan bir sekilde SetCookie() fonksiyonuyla
da manipule edebilirsiniz.
SetCookie("foo", "bar");
HTML cookie'leri , HTTP basliklari kullanilarak uygulanmaktadir.
Mesela asagidaki php kod blogunu
ele alalim:
<?php
SetCookie("foo", "bar");
print "Cookie yaz.";
?>
Bu kod blogunun web sunucusundan ciktisi asagidaki sekilde olacaktir:
HTTP/1.1 200 OK
Date: Sat, 02 Sep 2000 21:43:02 GMT
Server: Apache/1.3.11 (Unix) mod_macro/1.1.1 PHP/4.0.2-dev
X-Powered-By: PHP/4.0.2-dev
Set-Cookie: foo=bar
Connection: close
Content-Type: text/html
Cookie yaz.
Kullanicinin web tarayicisi yukaridaki web ciktisini aldiginda
'foo' adinda ve 'bar' degerine
atanmis bir cookie'nin olusturulmus oldugunu anlayacaktir.
CIKTI KONTROL FONKSITONLARINA NEDEN IHTIYAC DUYUYORUZ.
Cikti kontrol fonksiyonlarinin koku PHP/FI zamanlarina dayanir.
Makalemizin basinda cikti kontrol
fonksiyonlarinin header() fonksiyonu kullanildiginda alinabilecek
hatalara bir cozum olarak
dizayn edildigini soylemistik. Bu hatalarin metnini tekrar
hatirlayalim:
"Cannot add header information - headers already sent"
veya
Oops, php_set_cookie called after header has been sent"
Peki bu hatalar hangi kosullarda meydana geliyor? Bu hatalar
PHP HTTP basligini gonderip bos bir satir ile de basligin tamamlanip
asil govdeye gecildigini belirttikten sonra HTTP basligina birsey
eklemeye veya baslikta birsey degistirmeye calistigimiz zaman
meydana gelir. Bunun sebebi HTTP basligi ve bunu takip eden
bos satir tarayiciya gonderildikten sonra tarayicinin artik
yeni baslik
bilgilerini govdeden ayiramamasindan dolayir. Daha dogrusu bu
kisitlamadan dolayi, PHP isteginizi
gerceklestirmeden bir hata mesajiyla sizi durdurmaktadir.
Bu problem genelde baslik bilgilerini govde ciktisindan once
gondermeye dikkat ederek kolayca
cozulebilse de bu kisitlama bazen cok kolay olabilecek programlari
gereksiz sekilde zorlastirabilir.
Iste bu asamada Cikti Kontrol Fonksiyonlari yardimimiza yetismektedir.
CIKTI KONTROLU NASIL CALISIR?
Cikti kontrolu aktive edilmis oldugunda PHP ,normalden farkli
olarak, program cikti gonderdigi anda
HTTP basligini tarayiciya gondermez. Bu bilgileri ve ciktiyi
tarayiciya gondermek yerine, dinamik olarak buyuyen ( gerektikce
kendi kendine genisleyen ) bir buffer ( tampon ) 'a gonderir.
Bu sayede
baslik satirini gecmis olmaniza zaman tarayiciya henuz gonderilmedigi
icin istediginiz cookie ve
baslik islemlerini yapmaya devam edebilirsiniz. En basit halinde
program sona erdiginde PHP otomatik olarak HTTP basligini
ve HTML govdesini tampon'dan tarayiciya gondermeye baslayacaktir.
TEMEL KULLANIM:
ob_start()
Cikti kontrolunu aktif hale getir. Bu fonksiyonu bir birinin
icinde birden fazla cagirmak mumkundur.
ob_end_flush()
Tampon'da biriktirilenleri gonderip, cikti kontrolunu sona
erdir.
ob_end_clean()
Tampon'da birikenleri GONDERMEDEN, cikti kontrolunu sona
erdir.
ob_get_contents()
Tampon icerigini bir STRING olarak almaya yarar. Bu sayede
programini ciktisini tarayiciya gondermeden bir kez daha
degistirmek mumkun olmaktadir.
Buna ilaveten php.ini kurulum dosyasindaki output_buffering
direktifini aktif hale getirerek her php sayfanizin ob_start()
fonksiyonu cagirilmis gibi davranmasini saglayabilirsiniz.
Ornek 1:
<?php ob_start(); ?>
<h1>Ornek 1</h1>
<?php
print "Merhaba, $kullanicin";
SetCookie("Cerez", "Yukaridaki satir cikti gondermesine
ragmen yine de bu cookie yaratildi");
?>
Bu ornekte hem html tagleri (<H1> ve </H1>) hem
de print() fonksiyonu cikti gondermesine ragmen,
SetCookie direktifi ,cikti kontrol mekanizmasi sayesinde,
sorunsuz (ve hatasiz) olarak calisacaktir.
Cikti kontrol sistemi , web sunucunuza bir miktar ek yuk bindirmektedir
bu yuzden bu fonksiyonu surekli aktif hale getirmeden once
bunu gozonune almalisiniz.
Ornek 2:
<?php
ob_start();
print "Bu ornekte bir string'in boyunu kullanissiz bir yontemle
bulacagiz";
$uzunluk = strlen(ob_get_contents());
ob_end_clean();
?>
Yukaridaki ornekte kisaca ciktiyi tarayiciya gondermek yerine
tampon'da tutup daha sonra tampondan geri cikarip boyuna bakiyoruz.
Bu asamada tarayiciya gondermekten vazgecip ob_end_clean()
ile tamponu bosaltiyoruz. Boylece cikti kontrolunu de durdurmus
oluyoruz.
Simdilik bu kadar.. Bu makalenin ileriki bir bolumunde cikti
fonksiyonlarinin ileri seviyede kullanim sekillerine ve bu
fonksiyonlarla web sitelerimizden transfer ettigimiz dokumanlari
sIkIstirip ( yani compression) gondererek web sitelerimizi
nasil hizlandirabilecegimize deginecegiz.
Size fikri vermek acisindan daha kendi kendinize yazabileceginiz
bir program fikriyle makalemizi bitiriyoruz.
Cikti Kontrol Fonksiyonlariyla Dinamik Sayfalar Yazilimi:
Eger web siteniz'de bir sayfa bir veritabani sorgusunun uzun
surmesi dolayisiyla veya herhangi bir
baska sebebpten cok uzun zamanda yukleniyorsa dokumanin bir
kismini tampon'a yukleyip sayfayi yavaslatan bolume baslamadan
bunu tarayiciya gondererek kullaniciya sayfa daha hizli yukleniyor
izlenimi vermek mumkun.. Sorgunun sonucunu beklemeden cikti
vermeye baslayabileceginizden bazi kosullarda gercek anlamda
bir hizlanma da soz konusu olabilir.
En basitinden sorguya baslamadan once "Lutfen bekleyiniz sayfa
yukleniyor" turu bir mesaj cikarmaniz cikti kontrolleri sayesinde
artik mumkun.
Faydali olmasi dilegiyle
Oktay Altunergil
oktay@turk-php.com
http://www.turk-php.com/
Not: Bu makalede buyuk olcude Zeev Suraski'nin ayni konudaki
makalesinden yararlanilmistir.
|