Eğer söz fonksiyonların operasyonların bazı temel anlayış olması gerekir size yazdım tabloların değerini anlamak için. Ben burada onları yıkmak için çalışacağım.
Let's start with session_start()
and header()
calls:
The first function does exactly what the name implies; it starts a session.
Nedeniyle HTTP protokolü vatansız doğası, sayfa istekleri arasında durumunu hatırlıyorum bazı mekanizmasına ihtiyaç vardır. Bu oturumları ile elde edilebilir. Oturumları, bazen bağlantıları oturum kimliği boyunca geçerek yayılır PHP ilk günlerinde (someurl?sessionId=someSessionHash
), bu, günümüzde, kötü bir uygulama olarak kabul edilir olsa.
Günümüzde, seans ağırlıklı bir çerez ile takip edilmektedir (yaygın olarak kullanılan çok nerede ilk günlerinde, beni yanlış alamadım). Bu oturum çerezi (tarayıcınızı kapattıktan sonra onun içinde, o (Yukleme) basitçe sona ki, kanının aksine, sadece oturum kimliği ile normal bir çerez daha fazla bir şey değildir) Her sonra açılan her sayfa isteği ile tarayıcıya birlikte gönderilir . Bir çerez şöyle, (gerçek vücut öncesi anlamı) tepkinin bir başlık olarak gönderilir: yakalamak Ve burada:
// I've left out a lot of other headers for brevity
HTTP/1.x 200 OK
Date: Sun, 31 Jan 2010 09:37:35 GMT
Cookie: SESSION=DRwHHwAAACpes38Ql6LlhGr2t70df // here is your Cookie header
// after all response headers come the actual content:
// the response body, for instance:
<html>
<head>
</head>
<body>
</body>
</html>
Şimdi, yanıt başlıkları tepki beden önce gönderilmesi gerekir, çünkü herhangi bir vücut içerik çıkışı önce session_start()
ve header()
için bir çağrı koymak gerekir. İşte nedenleri: çıktı session_start()
veya header()
için bir çağrı daha önce herhangi bir yanıt vücut içerik (bir boşluk karakteri gibi basit bir şey olabilir), PHP otomatik olarak çıkış yanıt başlıkları eğer. Bir HTTP yanıt yanıt başlıkları yanıt gövdesinde ilk önce gönderilen olması gerekir çünkü bu. Ve genellikle PHP rezil Warning: headers already sent
uyarı yol açtığı tam olarak budur. Diğer bir deyişle; çok vücut veri göndermek zorunda kaldı, çünkü PHP, başlıklarını gönderdi kez, artık herhangi başlıkları eklemek olamaz.
Yani, şimdi, HTTP protokolü hakkında bu anlamak, Bunu önlemek için alabileceğiniz bazı ölçümler vardır. Biz sonraki fonksiyonu (ler) için geldiğim ve bu:
ob_start
, ob_flush
, etc...:
In a default setup PHP usualy outputs anything immediately. Therefor, if you output any response body content, headers are automatically sent first.
But PHP offers mechanisms of buffering output. This is the ob_*
family of functions. With ob_start
you tell PHP to start buffering. And with ob_flush
you tell PHP to flush the buffer; in other words output the current content of the buffer to the standard output.
Eğer çıkış gövdesi verileri aldıktan sonra, bu tamponlama mekanizmaları ile hala bir çağrı ile, daha sonra çıkış olması için, aslında henüz gövdesi verileri gönderdiğiniz değil çünkü, sadece onu tamponlu var, yanıt başlıkları ekleyebilirsiniz {[(0) ]} veya ob_end_flush
ve ne var.
Kullanarak ob_*
fonksiyonlar genellikle bir kod kokusu daha fazla olduğunu, ama unutmayın. Diğer bir deyişle (o üstünde bazı şeyler yapmak için neden önemli olduğunu ve bu), o zaman kötü tasarım telafi etmek için kullanılır. Birileri bu header
ve session
dram aşmak için çıkış buffering'e onların düzgün işlemlerin sırasını ve tatil köyleri kurmak için unuttum.
Html ve / veya diğer vücut içeriğin çıkışının son gelmelidir neden tüm bunları söyledikten sonra, kolayca görebilirsiniz. Bunun dışında, ben kesinlikle yine çıktı koddan PHP kodlarını ayırmak için tavsiye. Çok daha okumak ve anlamak kolaydır çünkü. Ve bunu yaparken başlamak için iyi bir yoldur gerçek html ana <?php ?>
kod bloğu sonra gelmek yaşıyor. Ancak diğer yollarla bu soruların kapsamı dışında olan, hem de vardır.
Ardından son olarak include
ve require
aramalarla ilgili. Php dosyaların üstünde bu var genellikle netleştirilmesi gereken ment. Bu bir yerde güzel bu çağrıları tutar. Ancak, unutmayın ki, çıktı tamponlama kullanmadan session_start()
veya header()
aramadan önce, yine bu dosyalar çıktı şeyden birini vidalı eğer.