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

diE*_*cho 1 html php

  • 我读到了ob_start()应该放在页面顶部的某个地方.而
  • 我读到的某个地方session_start()应放在页面顶部.
  • 我读到的某个地方header()应该放在页面的顶部.
  • 我读过的某个地方 include()或者require()应该放在页面顶部.

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

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

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

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

Dec*_*ler 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>
Run Code Online (Sandbox Code Playgroud)

现在,因为必须在响应主体之前发送响应头,所以需要在输出任何主体内容之前session_start()header()之前调用.这里的原因:如果你输出任何回应主体内容(可能是一个空白字符一样简单的东西)呼叫前session_start()header(),PHP会自动输出的响应头.这是因为HTTP响应必须首先在响应主体之前发送响应头.正是这种情况经常导致Warning: headers already sentPHP中臭名昭着的警告.换一种说法; 一旦PHP发送了标题,因为它也必须发送正文数据,它不能再添加任何标题.

因此,既然您已经了解了有关HTTP协议的信息,那么您可以采取一些措施来防止这种情况发生.这就是我们进入下一个功能的地方:

ob_start,ob_flush等等......:
在默认设置中,PHP通常会立即输出任何内容.因此,如果您输出任何响应正文内容,则会首先自动发送标题.
但是PHP提供了缓冲输出的机制.这是ob_*一系列功能.随ob_start你告诉PHP开始缓冲.并ob_flush告诉PHP刷新缓冲区; 换句话说,将缓冲区的当前内容输出到标准输出.

使用这些缓冲机制,你仍然可以在输出正文数据之后为响应添加标题,因为你还没有实际发送过正文数据,你只需要缓冲它,稍后通过调用ob_flush或者ob_end_flush你有什么输出来输出.

但请记住,使用ob_*函数通常不仅仅是代码味道.换句话说(这就是为什么在顶部做某些事情很重要),然后用它来弥补糟糕的设计.有人忘了正确设置他们的操作顺序,并采取措施输出缓冲来规避这个headersession戏剧.

说完这一切之后,你可以很容易地看出为什么输出html和/或其他正文内容应该是最后的.除此之外,我强烈建议您将PHP代码与输出代码分开.因为它更容易阅读和理解.开始这样做的一个好方法是让主要<?php ?>代码块之后出现实际的html .但是还有其他方法,这超出了这个问题的范围.

然后最后关于includerequire电话.要将这些放在php文件的顶部,通常需要澄清.它可以很好地将这些调用保存在一个地方.但请记住,如果其中一个文件在您打电话之前输出任何内容session_start()header()没有使用输出缓冲,那么您再次被搞砸了.