PHP 页面报错Warning</b>: Cannot modify header information - headers already sent by

先给出解决方案再解释,如果急着用就不用看解释了。

解决方案一:保存php文件编码为utf-8无BOM码,具体操作可以用notepad++等编辑器完成,把 sesstion_start() 放在文档所有输出(包括html标签和php的输出语句,具体以实际运行后有无输出为准)之前。

解决方案二:有些同志虽然遵循了第一条方案,但由于php页面被include或require到另外一个页面中,导致前方有输出,同样报错,如果不想时刻注意session_start()使用位置的问题,可以在文件最开头写上 "ob_start()" 来打开缓冲,前提是没有使用带BOM的utf-8编码;

解决方案三:打开php配置文件php.ini,找到"output_buffering",设置为"On",这种方法个人不推荐,因为如果不能在开发过程中解决问题而依赖于服务器配置,那作品的可迁移性就非常差了;

有些人建议使用"@"符号来屏蔽错误信息,最好不要听,那属于掩耳盗铃。

问题原因:服务器返回给客户端(浏览器)的文档流分为头部和体结构,头部必须在体结构之前,所谓体结构,通俗地说就是html流;

而session_start()和header()之类方法都属于对文档头部信息的操作,因此在使用之前不能有任何html标记和php输出,但utf-8的BOM作为一段标记文件编码的不可见字符,却会被php当做输出,从而导致错误------php的设计理念中压根就没考虑utf-8的BOM这一说;

新版本的php都支持输出缓冲,从而可以在session使用之前把已输出的内容存放在缓冲区内,之后按顺序输出,后两个解决方案的原理就是打开了输出缓冲区。

经过一晚上的调试,终于找到了问题所在,上面的代码在html页面之后又调用了一个语言转换的方法,错就错在这个语言函数又继承了KernelService类,这个类里面执行了header处理,所以报了这个错误,正常的代码如最后一张图,是不能调用这个Kernel类的。

相关推荐
BingoGo10 小时前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack10 小时前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack1 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo1 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack2 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理3 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1233 天前
matlab画图工具
开发语言·matlab
dustcell.3 天前
haproxy七层代理
java·开发语言·前端
norlan_jame3 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone3 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc