MultiServis.Net //PHP El Kitabı

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>

Sifreleme Algoritmalari ve Veri Guvenligi Yazar: Oktay Altunergil Tarih: 01/03/02

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/
Mayis 11, 2001

Not: Bu makalede buyuk olcude Zeev Suraski'nin ayni konudaki makalesinden yararlanilmistir.

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>