最容易忽视BUG UTF8 BOM头

项目场景:

项目相关背景:
项目场景:华为鲲鹏云部署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头这个问题属于重要但很容易忽视的问题,遇到了第一不会想到是这种问题,自然而然的也就会忽略掉它,所以本次教训很惨痛,特意写一篇文章记录,确保后面不会再犯这种低级错误
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
边界值容易引发 bug 的原因主要有以下几点: 1. 边界条件容易忽视:在编写代码或设计系统时,人们往往更关注常规情况而忽视了边界条件。这导致在处理边界值时可能存在逻辑错误或未考虑到的情况。 2. 边界条件可能引发特殊行为:边界值通常会导致系统或算法的特殊行为,这些行为可能与常规情况不同。如果在处理边界值时没有正确考虑这些特殊行为,就容易出现错误。 3. 边界条件测试不充分:测试用例通常会覆盖一般情况,但往往忽略了边界条件。如果没有充分测试边界值,就无法发现潜在的问题。 4. 数字处理精度问题:在涉及到浮点数或小数计算时,边界值可能导致精度问题。由于计算机表示数字的限制,处理边界值时可能出现舍入误差或精度丢失。 为了避免边界值引发的 bug,可以采取以下措施: 1. 明确定义边界条件:在设计和编写代码时,明确定义边界条件,并确保正确处理这些情况。 2. 进行全面的测试:在测试阶段,充分考虑边界值,并编写相应的测试用例来覆盖这些情况。 3. 注意特殊行为:了解边界值可能引发的特殊行为,并在代码中正确处理这些情况。 4. 考虑数值精度:对于涉及到浮点数或小数计算的情况,需要注意处理数值精度的问题,避免舍入误差或精度丢失。 通过以上措施,可以减少边界值引发 bug 的概率,并提高系统的稳定性和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bobo-rs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值