什么意思在php文件的页面顶部

时间:2010-01-31 09:14:10

标签: php html

  • 我在某处读到ob_start()应放在页面顶部的位置。而
  • 在某处我读到session_start()应放在页面顶部。
  • 我读到header()的地方应放在页面顶部。
  • 我读到include()require()的地方应放在页面顶部。

我很困惑应该在顶部写下什么以及放置哪个顺序?什么意思是在顶部???

  • <html>
  • 之前
  • <html>之后或<head>之前或
  • 之后
  • <head>
  • 之后

请告诉我这些功能的实际顺序是什么

就像我们必须放置ob_end_flush();以及其他功能,在<html>之后或</body>之后的页面底部,以及页面底部的功能顺序是什么

3 个答案:

答案 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_startob_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文件的顶部,通常需要澄清。它可以很好地将这些调用保存在一个地方。但请记住,如果其中一个文件在您使用requiresession_start()而不使用输出缓冲之前输出任何内容,则会再次被搞砸。

答案 1 :(得分:4)

“页面顶部”表示任何输出之前。 “页面底部”表示所有输出后。

答案 2 :(得分:2)

它只是意味着在任何其他字符之前,其中“other”表示“非PHP代码”。

<?php?>之间的所有代码都不会发送到浏览器,因此不会计算在内。因此,通常“页面顶部”表示<html>开始标记之前。要小心,因为如果你在该标记之前(甚至在PHP开始标记之前)有一个空行或者只有一个空格,那么它就算作输出。