Laravel 4项目Artisan及页面出现多余<?php前缀问题求助
解决Laravel 4中Artisan命令与页面输出开头带
<?php的问题 这种问题我之前帮好几个开发者排查过,大概率是文件编码问题或者某个文件的开头存在多余输出导致的,咱们一步步来定位解决:
1. 先检查核心入口文件
首先看两个最关键的入口文件,有没有被误修改:
- 打开项目根目录的
artisan文件,第一行应该是#!/usr/bin/env php,第二行是<?php,检查这两行之前有没有多余的<?php字符串或者空白字符; - 打开
public/index.php,第一行必须是<?php,确认前面没有任何额外内容(包括看不见的空白)。
2. 排查UTF-8 BOM头问题
很多编辑器(比如旧版Notepad++)保存UTF-8文件时会自动添加BOM头(三个不可见的字符),PHP会把这个BOM当作输出内容,有时候会表现为奇怪的前缀(比如你遇到的<?php)。在Vagrant的虚拟机里执行以下命令,找出带BOM的PHP文件:
find /path/to/your/project -name "*.php" -exec grep -l "^\xEF\xBB\xBF" {} \;
找到这类文件后,用编辑器(比如VS Code、Sublime)以“UTF-8无BOM”格式重新保存即可。
3. 查找开头重复<?php的文件
有可能某个文件的开头不小心写了两次<?php,导致输出前缀。执行以下命令搜索整个项目:
grep -r "^<\?php.*<\?php" /path/to/your/project --include="*.php"
如果找到这类文件,删掉多余的<?php即可。
4. 检查Laravel启动文件与自定义代码
- 查看
bootstrap/autoload.php和bootstrap/start.php这两个启动核心文件,确认开头的<?php之前没有任何输出,同时注意不要在文件末尾加闭合的?>(Laravel官方推荐省略,避免意外输出空白); - 排查你自己写的服务提供者、中间件、配置文件,以及引入的第三方包,看看有没有文件在
<?php标签之前就输出了内容(比如不小心写了<?php在外面)。可以尝试暂时禁用第三方包,执行composer dump-autoload后测试,逐步定位问题来源。
5. 排除服务器配置问题
既然你其他Laravel 4项目运行正常,这个概率很低,但可以快速确认:检查php.ini的output_buffering设置,或者Nginx/Apache的站点配置,确保没有额外的响应内容被插入。
按照上面的步骤排查,基本就能找到问题所在了,最常见的情况就是BOM头或者某个文件的多余<?php输出。
内容的提问来源于stack exchange,提问作者Tomáš Staník
相关产品推荐
相关产品推荐

