共计 1161 个字符,预计需要花费 3 分钟才能阅读完成。
“Cannot modify header information – headers already sent” 是一个常见的 PHP 谬误,它通常是因为在输入 HTTP 头信息之前输入了其余内容(例如空格、换行、HTML 代码等)导致的。HTTP 头信息包含了响应的状态码、响应的 MIME 类型、cookie 等等,它必须在任何响应内容之前输入。
解决这个谬误的办法是要确保在输入 HTTP 头信息之前没有输入任何内容。以下是几种可能导致这个谬误的状况以及相应的解决办法:
(1)在 PHP 文件中,确保没有在 <?php 和 ?> 标签之外输入任何内容。如果必须输入其余内容(例如 HTML 代码),能够将 PHP 代码和 HTML 代码拆散成两个文件。(2)如果应用了 header 函数设置 HTTP 头信息,要确保在 header 函数之前没有输入任何内容。一种解决办法是将 header 函数放在 PHP 文件的结尾,或者在调用 header 函数之前应用 ob_start 函数开启输入缓冲区。
(3)如果应用了 session\_start 函数启动会话,要确保在调用 session\_start 函数之前没有输入任何内容。一种解决办法是将 session\_start 函数放在 PHP 文件的结尾,或者在调用 session\_start 函数之前应用 ob_start 函数开启输入缓冲区。(4)查看是否在蕴含其余文件时产生了这个谬误。如果在被蕴含的文件中输入了内容,也会导致这个谬误。
如何检测
在 PHP 中,能够应用 headers\_sent 函数检测 HTTP 头信息是否曾经发送。headers\_sent 函数有两个参数,第一个参数是援用传递的变量,用于返回发送头信息的文件名和行号;第二个参数用于指定在哪个文件中开始检测。如果不指定第二个参数,则默认从以后脚本的起始地位开始检测。
以下是一个示例代码,用于检测 HTTP 头信息是否曾经发送:
if (headers_sent($file, $line)) {echo "HTTP headers already sent in $file on line $line";} else {echo "HTTP headers not sent yet";}
如果 headers\_sent 函数返回 true,则阐明 HTTP 头信息曾经发送,并且 $file 和 $line 变量将返回发送头信息的文件名和行号。如果 headers\_sent 函数返回 false,则阐明 HTTP 头信息尚未发送。
如果须要在检测完 HTTP 头信息后发送新的头信息,能够在调用 headers\_sent 函数之后应用 header 函数来发送新的头信息。如果在检测完 HTTP 头信息后调用 header 函数,而且 HTTP 头信息曾经发送,则会产生一个正告,但头信息依然会被发送。因而,倡议在发送头信息之前先调用 headers\_sent 函数来检测是否曾经发送。