headers already sent问题解决

背景

Leniy’s Blog 使用了大量自己编写的小函数来实现各种目的,同时简化操作。
之前我是把所有的函数均放在一个php中,然后作为一个插件启用。
今天我又往里面加了1个函数。因为全部代码看着太杂乱,我就想要将不同的功能写到单独的php中,然后统一requir进来。

问题

当全部工作完成后,因为我对全部自写函数命名做了统一规范,需要把主题对应的部分修改过来。鉴于这只是小改动,我就直接在wordpress后台修改的主题文件。
然后提交修改…………

错误就这么出现了。
同时,插件管理后台也来了这么一句提示:

分析

pluggable.php第876行是设置header的。一般这个问题出现,要么是代码出问题,要么是编码出问题。而导致问题出现的语句是我提取出来的子php的第一行。
php文件的第一行是什么呢?大家应该都能想到:

这句话怎么会出现问题呢?再仔细看看代码两端,也没有多出来一个全角空格之类的不容易发现的错误啊。

难道我的代码出问题了?一遍一遍的检查后,可以确认无误。
文件编码也没问题吧,我写代码一律使用UTF-8以及UNXI的LF模式。

解决

半个来小时,问题一直解决不了,网上到处对这个问题的解说,不是重写代码就是ANSI转为UTF-8。
还好功夫不负有心人,在搜索页面的一个角落,发现有人提到这么一段话:

我把插件的代码逐步删除,看看什么时候正常了,那么当正常了的时候,就说明问题出在刚刚删除的代码中,结果发现,当代码只剩下插件信息的时候,还是会提示异常输出! … 然后我把其他的插件的信息复制过来,结果依然是一样的,这时候我觉得问题应该不是代码哪里出问题了,应该是编码什么的,于是我在cpanel文件编辑器中已utf-8保存,问题依旧… 在无奈之下,我只好回到我编辑代码用的Dreamweaver中,然后重新另存为,这时候我认真观察了一下保存时候的选项,发现下面有一个Unicode标准化表单:
“包含Unicode签名(BOM)”
看到这里的时候,我似乎看到了曙光,然然后我把那个包括Unicode签名的勾去了,保存后,插件正常启用了!

看到他这句话,我似乎也看到了曙光。
重新转换文件编码,由UTF-8转为UTF-8 no BOM格式。
重新启用插件,果然OK了。

经验教训

看来,写代码是不仅仅字符编码UTF-8、换行标记LF还是LF/CR需要注意,字节序标记BOM也要仔细参酌啊

作者: Leniy

Do not , for one repulse , give up the purpose that you resolved to effect . 本文著作版权归Leniy所有,并受法律保护。 转载、使用整体或任何部分的内容(包含但不限于各个页面的标题、评论框提示语)须经过Leniy的授权。 CopyRight © 2006-2017 Leniy.org all rights reserved.

23 thoughts on “headers already sent问题解决

  1. Yu

    hexdump your_file 其实就可以解决问题的

    不过,说回来,其实不过是看着结果找原因,纯属站着说话

      • Leniy

        难怪之前有人说,在我这里留言后,不能保存用户信息,刷新页面后还要重新输入。
        看来也是这个原因引起的,提前输出了bom导致cookie失效

        • 死神的微笑

          BOM是字节顺序,有点类似于咱们写代码时对字节处理时要注意的大端小端。

          • Leniy

            大端小端啊。做ARM嵌入式时经常要注意,写代码时倒是没怎么接触了

发表评论

电子邮件地址不会被公开。 必填项已用*标注