ob_start()
应放在页面顶部的位置。而session_start()
应放在页面顶部。 header()
的地方应放在页面顶部。include()
或require()
的地方应放在页面顶部。我很困惑应该在顶部写下什么以及放置哪个顺序?什么意思是在顶部??? 是
<html>
或<html>
之后或<head>
之前或<head>
请告诉我这些功能的实际顺序是什么
就像我们必须放置ob_end_flush();以及其他功能,在<html>
之后或</body>
之后的页面底部,以及页面底部的功能顺序是什么
答案 0 :(得分:9)
为了理解你所写的陈述的价值,你需要对你提到的功能的操作有一些基本的了解。我会试着在这里打破它们。
让我们从session_start()
和header()
来电开始:
第一个函数完全符合名称的含义;它开始一个会话。
由于HTTP协议的无状态特性,需要一些能够记住页面请求之间状态的机制。这可以通过会话来实现。虽然会话,在PHP的早期阶段,有时通过传递链接(someurl?sessionId=someSessionHash
)中的会话ID来传播,但现在这被认为是不好的做法。
如今,会话主要通过使用cookie来跟踪(在早期它们也广泛使用,不要误解我)。这个会话cookie(与流行的看法相反,只不过是一个普通的cookie,其中只有会话ID,(通常)在你关闭浏览器后简单到期)随着每个后续页面请求被发送到浏览器。以下是捕获的位置:cookie作为响应的标题发送(意味着在实际的主体之前),如下所示:
// 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>
现在,由于必须在响应正文之前发送响应标头,因此您需要在输出任何正文内容之前调用session_start()
和header()
。原因如下:如果在调用session_start()
或header()
之前输出任何响应正文内容(可能像空白字符一样简单),PHP将自动输出响应标头。这是因为HTTP响应必须首先在响应主体之前发送响应头。正是这种情况经常导致PHP中臭名昭着的Warning: headers already sent
警告。换一种说法;一旦PHP发送了标题,因为它也必须发送正文数据,它不能再添加任何标题。
因此,既然您已经了解了有关HTTP协议的信息,那么您可以采取一些措施来防止这种情况发生。这就是我们进入下一个功能的地方:
ob_start
,ob_flush
等......:
在默认设置中,PHP通常会立即输出任何内容。因此,如果您输出任何响应正文内容,则会首先自动发送标题
但是PHP提供了缓冲输出的机制。这是ob_*
函数族。使用ob_start
,您可以告诉PHP开始缓冲。使用ob_flush
,您可以告诉PHP刷新缓冲区;换句话说,将缓冲区的当前内容输出到标准输出。
使用这些缓冲机制,你仍然可以在输出正文数据之后为响应添加标题,因为你还没有实际发送过正文数据,你只需要缓冲它,稍后通过调用{{}来输出1}}或ob_flush
以及你有什么。
请注意,使用ob_end_flush
函数通常会产生代码味道。换句话说(这就是为什么在顶部做某些事情很重要),然后用它来弥补糟糕的设计。有人忘了正确设置他们的操作顺序并转而输出缓冲来绕过这个ob_*
和header
戏剧。
说完这一切之后,你可以很容易地看出为什么输出html和/或其他正文内容应该是最后的。除此之外,我强烈建议您将PHP代码与输出代码分开。因为它更容易阅读和理解。开始这样做的一个好方法是让实际的html位于主session
代码块之后。但是还有其他方法,这超出了这个问题范围。
然后关于<?php ?>
和include
来电。要将这些放在php文件的顶部,通常需要澄清。它可以很好地将这些调用保存在一个地方。但请记住,如果其中一个文件在您使用require
或session_start()
而不使用输出缓冲之前输出任何内容,则会再次被搞砸。
答案 1 :(得分:4)
“页面顶部”表示任何输出之前。 “页面底部”表示所有输出后。
答案 2 :(得分:2)
它只是意味着在任何其他字符之前,其中“other”表示“非PHP代码”。
<?php
和?>
之间的所有代码都不会发送到浏览器,因此不会计算在内。因此,通常“页面顶部”表示<html>
开始标记之前。要小心,因为如果你在该标记之前(甚至在PHP开始标记之前)有一个空行或者只有一个空格,那么它就算作输出。