|
| Makaleler |
| Toplam Makale |
3330 |
| Yayında |
3150 |
| Bekleyenler |
180 |
| Görüntüleme |
13322536 |
|
|
|
|
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:-
- 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:
PHP:-
- 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:-
- <?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:-
- <?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.
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.
Eklenme tarihi: 3-2-2006 Okunma: 2140
|
| Bu Makaleye Verilen Puan: |
|
Kullanıcı Yorumları
Deniz
Tarih:
25-11-2006
2:54am
süper olmus. yazanin zihnine saglik.
İlgili Dökümanlar
|
|
|