<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 这部分代码与文章内容无关,演示前置代码块</span></span><span>
</span><span><span class="hljs-title function_ invoke__">date_default_timezone_set</span></span><span>(</span><span><span class="hljs-string">'Asia/Shanghai'</span></span><span>);
</span><span><span class="hljs-variable">$now</span></span><span> = </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">'Y-m-d H:i:s'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"当前时间:<span class="hljs-subst">$now</span></span></span><span>\n";
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
在PHP开发过程中,操作HTTP响应头是非常常见的需求。`</span><span><span class="hljs-title function_ invoke__">header</span></span><span>()`函数允许我们向客户端发送原始的HTTP头信息,而`</span><span><span class="hljs-title function_ invoke__">headers_sent</span></span><span>()`函数则可以检测头信息是否已经发送。合理结合这两个函数,能够有效避免因重复发送头信息导致的错误,从而提升程序的健壮性和用户体验。
</span><span><span class="hljs-comment">## 1. `header()`函数简介</span></span><span>
`</span><span><span class="hljs-title function_ invoke__">header</span></span><span>()`用于发送原始HTTP头。例如,设置跳转、指定内容类型、控制缓存等:
```php
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Location: http://example.com'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Type: application/json'</span></span><span>);
</span></span>
但是,如果HTTP头已经发送(比如已经输出了部分HTML或空白字符),再调用header()就会触发“Cannot modify header information - headers already sent”的错误。
headers_sent()用于检测HTTP头是否已经发送给客户端。它的典型用法:
<span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">headers_sent</span></span><span>()) {
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Location: http://example.com'</span></span><span>);
</span><span><span class="hljs-keyword">exit</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Headers already sent, cannot redirect.'</span></span><span>;
}
</span></span>
这样可以避免在头信息已发送后调用header()导致程序异常。
提前调用header(),避免输出任何内容
PHP一旦输出内容,HTTP头就会自动发送。因此,确保header()调用前不要有任何echo、print或HTML输出。
使用headers_sent()做检测,防止重复发送头信息
在复杂程序或模板系统中,可能难以完全控制输出顺序,此时使用headers_sent()检查尤为重要。
在发现头已发送时,采取替代方案
例如,使用JavaScript跳转或提供手动链接,避免程序崩溃。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 假设某处可能已输出内容</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"欢迎访问!"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">headers_sent</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-variable">$line</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Location: http://example.com'</span></span><span>);
</span><span><span class="hljs-keyword">exit</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<script>window.location.href='http://example.com';</script>"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<p>页面跳转失败,请点击 <a href='http://example.com'>这里</a>。</p>"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"Headers already sent in <span class="hljs-subst">$file</span></span></span><span> on line </span><span><span class="hljs-subst">$line</span></span><span>.");
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
header()和headers_sent()的结合使用能显著提高HTTP头操作的安全性和灵活性。尤其在大型项目或框架中,这种检测机制能避免因输出顺序错误导致的致命错误,使代码更健壮、更易维护。养成良好的输出控制习惯和使用头检测的意识,是PHP开发中的重要最佳实践。
<span></span>