最容易忽视BUG UTF8 BOM头
程序员文章站
2022-05-25 22:57:41
...
项目场景:
项目相关背景:
项目场景:华为鲲鹏云部署thinkPHP3.2.3示例项目,运行项目并登录系统,登录失效,客户端无法存储客户的临时身份ID
问题描述:
项目中遇到的问题:
项目在各个环境部署运行使用皆无问题,迁移到华为鲲鹏云之后,发现登录失效,用户无法正常登录,打开客户端调试窗口,查看应用cookie居然是空的,啥cookie信息皆没有存储到,上调试代码:
public function test()
{
$data['user'] = session("xxxx");
$data['token'] = session("xxxx");
// 设置信息
session("test",["msg"=>"设置调试信息"]);
$data['test'] = session("test");
// 原生
$_SESSION['test_session'] = "调试session";
$data['_test'] = $_SESSION['test_session'];
$data['_tests'] = session("test_session");
// session
$data['sessionId'] = session_id();
$data['sessionIds'] = $this->session_id;
$data['session_name'] = session_name();
// cookie
cookie(session_name(),$this->session_id);
$data['_cookie_id'] = cookie(session_name());
// 不好玩 默认设置
$config = array(
'prefix' => "", // cookie 名称前缀
'expire' => 86400, // cookie 保存时间
'path' => "/", // cookie 保存路径
'domain' => "", // cookie 有效域名
'secure' => false, // cookie 启用安全传输
'httponly' => 1, // httponly设置
);
cookie("test_cookie_id",$this->session_id,$config);
$data['cookie_config_id'] = cookie("test_cookie_id");
setcookie(
"ss_cookie",$this->session_id,time()+86400,"/"
);
$data['ss_cookie'] = cookie("ss_cookie");
$data['_ss_cookie'] = $_COOKIE['ss_cookie'];
$data['time'] = date("Y-m-d H:i:s");
$data['cookie'] = $_COOKIE;
responseData(200,"调试数据",$data);
}
复现环境
- 服务器:华为鲲鹏云
- 架构:ARM架构
- 操作系统:CentOS 6c/16G
- PHP版本:5.6.40
- MySQL版本:5.7
- 依赖服务:Redis,mongoDB等
- 系统框架:ThinkPHP3.2.3 (老版本)
原因分析:
问题的分析: 根据上面调试代码,确定session服务端生成是没有问题的,而且使用$_COOKIT 获取cookie,也能获取到当时设置的cookie值,为了确定是否框架自带的cookie方法是否有问题,采用原生setcookie就行设置cookie,结果都是不行,那就不是框架cookie的问题,但一时问题就卡住了,业务代码和其他环境都不能复现,只能登陆到华为鲲鹏云服务器进行断点调试,后面调试了各种方案皆是没有问题,后面怀疑是否服务器配置有问题(问题被卡住就会对所有有关的服务产生怀疑),单独上了一个独立的cookie文件,示例代码如下:
// 设置系统时区
date_default_timezone_set("PRC");
setcookie(
"ss_cookie",time(),time()+86400,"/"
);
print_r($_COOKIE);
直接在里面设置cookie,允许发现居然可以,再次确定服务器配置是没有问题的,那就只能是代码的问题了,后面想到以前遇到文件BOM问题,灵光一闪百度了一下,发现以前的经常遇到的BOM问题在后面的不端完善中很多服务器已经兼容了BOM格式,然后使用notepad++打开入口文件,发现真的是UTF8 BOM头,天了啊一天时间,就被这个破问题给绊住脚了,找到问题了就能解决。
解决方案:
解决方案:
采用notepad++编辑器打开入口文件及其他有问题的文件(注:我这里只有入口文件)修改文件编码格式UTF-8,去掉BOM头push代码上去,完美解决。
心得
BOM头这个问题属于重要但很容易忽视的问题,遇到了第一不会想到是这种问题,自然而然的也就会忽略掉它,所以本次教训很惨痛,特意写一篇文章记录,确保后面不会再犯这种低级错误上一篇: 无BOM utf8编码判断
推荐阅读