顶~~N久没发表东西了,近来paperen除了工作还是工作,paperen对于公司目前的项目管理有一大堆意见~~不过新来就不要太激进了,前段时间已经因为自己对于目前开发的那个项目首页的性能而弄了一个小会,我提的意见主管老是说好,但是结果还是没有落实,唉,算啦~~竟然他们都不理会,paperen会用代码与实例来证明给他们听的啦。

今天自己将本机中的后台代码传上本地网络的一台测试服务器上(因为他们要在局域网中测试项目),但是遇到了一个header的问题,让paperen郁闷了一会。自己用下面这个函数来重定向(有js模式的重定向与直接使用header),比如后台某些操作成功后会自动跳转之类的功能,当然也会直接跳转。

function dheader($location, $isjs = false, $timer = 1){
if(empty($location)) return '';
if($isjs){
$timer = $timer*1000;
echo "<script type='"text/javascript"'>setTimeout("window.location.href='$location'", $timer);</script>";
}else{
header("location:$location");
exit();
}
}

而结果在直接header时总出现警告。

20100812205949

在header之前已经有输出,没错就是这个原因。

网上资料很多而且说得已经很明白。不能在header前有任何输出。

http://www.itlearner.com/article/4467

但是感觉不可能吧,我之前貌似没输出吧,而错误提示提示我出现在引入语言包之前,嗯,没错那个语言包是有字符,不过是放在一个数组,难道这也会有影响?将语言包的那个变量注释掉~~结果还是提示已经在这个语言包文件中有输出……

paperen开始怀疑是不是不能引入这个语言包是中文的问题……但是注释调还是提示,这次我干脆删掉整个变量再试,结果还是不行,但是当我删掉整个语言包变量后发现了问题所在……就是换行符的问题!!

20100813084019

f**k,paperen真是太大意了,of course这个换行符也是输出,竟然被自己忽略了。

个人觉得在header前不能有任何输出的意思是在调用header之前不能有任何非php代码的插入(不在标记包含之中的都属于非php代码),还有个人认为不要使用记事本编辑utf8格式的php文件,貌似记事本会为utf8文件加上一个文件头BOM(Unicode Signature),而这个头标志可能也会属于一个输出~~

当然,即使确实不能避免在header前有输出,那么可以使用ob来解决这个问题滴~~正如上面的那个链接中说关于header的注意技巧。在输出前使用ob_start();在header前ob_end_clean,或许您不明白到底这个ob是干嘛滴,查查php手册就可以有关于这个老兄的说明。

ob_start--This function will turn output buffering on. While output buffering is active no output is sent from the script (other than headers), instead the output is stored in an internal buffer.

就是说使用ob_start使用后服务端会将之前编译的代码放在临时的缓存中而不对其进行输出。当然要理解怎用还是要自己动手试试。

1.出现警告

<?php 
echo "顶你个肺~~";
header("location:header.html");
?>

2.header成功

<?php 
ob_start();
echo "顶你个肺~~";
ob_end_clean();
header("location:header.html");
?>

3.关于ob_start(),ob_end_clean()与ob_flush()的测试

<?php 
ob_start();
echo "顶你个肺~~";
ob_end_clean();
echo "再顶~~";
?>

相信您试完这些代码后就会明白的了~~