自动 grep 搜索 BOM,其中“无法修改已发送的标头信息标头”


Automated grep search for BOM with Cannot modify header information headers already sent

警告:无法修改标头信息 - 标头已由 发送(输出从示例.php:1开始)

看起来这些问题的数量是无限的,而且它们不断出现。我同意在大多数情况下,答案已经在那里。

我自己也遇到了同样的问题。输出中有一个神秘字符阻止我设置标题。由于它是一个包含大量文件的大型应用程序,因此无法浏览每个文件以搜索它。

我相信问题是由于 BOM 或其中一个包含文件中某处的<?php开始标签之前的多余空格造成的。当我打开错误消息中提到的文件时,看起来没有任何问题。

如何找到问题所在?

这是帮助我追踪该角色的自动化解决方案。需要 SSH 访问权限。

grep -v -R "^<?php" /home/public_html/ --include '*.php | grep "<?php"

grep是一个非常有用的工具,能够递归搜索文件和文件夹内容。

  • -v 表示排除,即输出与我稍后传递的正则表达式匹配的任何内容相反的
  • 输出
  • -R的意思是递归的,即在提供的文件夹内及其子目录中搜索
  • "^<?php" 是匹配以 PHP 开始标记前面的行 ( ^) 的表达式。同样,-v用于反转这一点,所以我得到了没有的行 - 这就是我所追求的。
  • /home/public_html/是包含我所有网站文件的文件夹
  • --include '*.php我们仅在.php文件中搜索
  • grep "<?php"是一个仅捕获文件第一行的技巧

问题是,-v标志反转搜索结果并输出与表达式不匹配的任何内容。因此,如果一个文件有 1000 行,只有第一行是<?php开始标记,这将输出所有 999 行,因为 thouse 与正则表达式不匹配。由于我只需要查看第一行,因此我将 greps 输出转发到另一个 grep 中,该 grep 再次过滤结果并确保我获得具有我传递的另一个条件的行 - 这又是开始标签。这是一种解决方法,它将 greps 输出限制为仅第一行。

希望这有帮助