Anasayfa > Programlama > PHP > PHP Cikti Kontrol Fonksiyonlari ve HTTP Basliklari
Makaleye verilen puanlar Makaleye verilen puanlar Makaleye verilen puanlar

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.

ÇIKTI:

  1.  
  2. HTTP/1.1 200 OK Date: Sat, 02 Sep 2000 21:40:08 GMT Server: Apache/1.3.11
  3. (Unix) mod_macro/1.1.1 PHP/4.0.2-dev Last-Modified: Sat, 02 Sep 2000
  4. 21:39:49 GMT ETag: "12600b-e-39b173a5" Accept-Ranges: bytes Content-
  5. Length: 14 Connection: close Content-Type: text/plain
  6. 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:

PHP:

  1.  
  2. header("Location: http://www.turk-php.com/"); // sayfayi yonlendir
  3. HTTP basligini direk olmayan bir sekilde SetCookie() fonksiyonuyla da manipule
  4. edebilirsiniz.
  5. SetCookie("foo", "bar");
  6. HTML cookie'leri , HTTP basliklari kullanilarak uygulanmaktadir. Mesela asagidaki
  7. php kod blogunu ele alalim:
  8. <?php
  9. SetCookie("foo", "bar");
  10.  
  11. print "Cookie yaz.";
  12.  
  13. ?>

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:

  1.  
  2. <?php ob_start(); ?>
  3. <h1>Ornek 1</h1>
  4.  
  5. <?php
  6.  
  7. print "Merhaba, $kullanicin";
  8.  
  9. SetCookie("Cerez", "Yukaridaki satir cikti gondermesine ragmen yine de bu
  10. cookie yaratildi");
  11.  
  12. ?>

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:

  1.  
  2. <?php 
  3. ob_start();
  4. print "Bu ornekte bir string'in boyunu kullanissiz bir yontemle bulacagiz";
  5. $uzunluk = strlen(ob_get_contents());
  6. ob_end_clean();
  7. ?>


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 Mayis 11,
2001
Not: Bu makalede buyuk olcude Zeev Suraski'nin ayni konudaki makalesinden
yararlanilmistir.

Program: http://zend.com/zend/art/buffering.php

Bu makale hakkında ek bilgi eklemek için buraya tıklayınız

Bu makalenin yazar yada kaynağını bildirmek için tıklayınız.

Digg this Post! Add Post to del.icio.us Bookmark Post in Technorati Furl this Post!
Eklenme tarihi: 3-2-2006  Okunma: 2140

Bu Makaleye Verilen Puan:    Makaleye verilen puanlar Makaleye verilen puanlar Makaleye verilen puanlar
Bu Makaleye Puan Ver  

Bölüm Başlık Kullanıcı Yorumları


Deniz Deniz

Tarih: 25-11-2006 2:54am

süper olmus. yazanin zihnine saglik.

Reklam Netinternet
Bazı hakları saklıdır: İçeriğin editör ve yazarlarımız tarafından oluşturulan kısımları ve site tasarımının hakkı saklıdır.  Bu sayfa en iyi 1280x1024 ve 1024x768 çözünürlükte izlenir.
Powered by BilgiPortal v2.2
Emlak Yorumlar Müzik estetik