解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题


Posted in PHP onApril 01, 2021

在使用thinkphp6的过程中,尤其是windows本地开发,要是碰到代码运行错误但是死活不报错的情况,可参考以下步骤:

常规步骤:

    1. 环境变量配置文件.env中APP_DEBUG设置为true。

APP_DEBUG=true

    2. 将config目录下的app.php文件中的show_error_msg设置为true。

// 显示错误信息
'show_error_msg'   => true,

如果上面操作无用,查看服务器(我用的是nginx)的错误日志,发现报错:“PHP Fatal error:  Uncaught InvalidArgumentException: Malformed UTF-8 characters, possibly incorrectly encoded in D:\phpStudy\PHPTutorial\WWW\tp6\vendor\topthink\framework\src\think\response\Json.php:50……”。看这个错误意思,再结合源码,这是json_encode()的时候报错了,字符编码的问题。接下来,非常规步骤,改源码!

非常规步骤:

    根据路径找到文件:“tp6\vendor\topthink\framework\src\think\exception\Handle.php”。

    查看源码,找到“Server/Request Data”,发现tp6获取的服务器信息内容非常的详细,如果你的计算机名为中文,或者某些文件夹名包含中文,那就会因为字符编码,而造成json_encode()报错。既然找到原因了,那就解决问题,转下获取内容的编码即可!

    在Handle.php的底部加上字符编码转换函数:

/**
     * 将获取的服务器信息中的中文编码转为utf-8
     * 修复在开启debug模式时出现的Malformed UTF-8 characters 错误
     * @access protected
     * @param $data array
     * @return array                 转化后的数组
     */
    protected function changeToUtf8(array $data): array
    {
        foreach ($data as $key => $value) {
            $data[$key] =  mb_convert_encoding($value, "UTF-8", "GBK, GBK2312");
        }

        return $data;
    }

    然后在获取服务器信息的地方调用转换:

//'Server/Request Data'   => $this->app->request->server(),
'Server/Request Data'   => $this->changeToUtf8($this->app->request->server()),

  这个时候再次发起请求,就可以看到详细的错误信息了!

这个问题曾经困扰了我很久才解决,如果您也碰到了这个问题,且这篇文章帮助到了您,欢迎点赞!

此问题已在tp6的git上pull requests,详情:https://github.com/top-think/framework/pull/2448

PHP 相关文章推荐
多重?l件?合查?(二)
Oct 09 PHP
聊天室php&mysql(五)
Oct 09 PHP
php 魔术方法使用说明
Oct 20 PHP
查找mysql字段中固定字符串并替换的几个方法
Sep 23 PHP
解析左右值无限分类的实现算法
Jun 20 PHP
php获取本周开始日期和结束日期的方法
Mar 09 PHP
php获取访问者浏览页面的浏览器类型
Jan 23 PHP
PHP判断是否是微信打开,浏览器打开的方法
Mar 14 PHP
tp5实现微信小程序多图片上传到服务器功能
Jul 16 PHP
laravel框架之数据库查出来的对象实现转化为数组
Oct 23 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
Aug 17 PHP
HTTP头隐藏PHP版本号实现过程解析
Dec 09 PHP
如何判断微信付款码和支付宝付款码
Apr 01 #PHP
Laravel中获取IP的真实地理位置
Apr 01 #PHP
Jsonp劫持学习
利用ajax+php实现商品价格计算
php微信小程序解包过程实例详解
Mar 31 #PHP
ThinkPHP5和ThinkPHP6的区别
Mar 31 #PHP
PHP基本语法
You might like
php正则校验用户名介绍
2008/07/19 PHP
PHP 开源框架22个简单简介
2009/08/24 PHP
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
php用数组返回无限分类的列表数据的代码
2010/08/08 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
Jquery 自定义动画概述及示例
2013/03/29 Javascript
利用js实现遮罩以及弹出可移动登录窗口
2013/07/08 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
2015/08/13 Javascript
js document.getElementsByClassName的使用介绍与自定义函数
2016/11/25 Javascript
JavaScript拖动层Div代码
2017/03/01 Javascript
Angular中自定义Debounce Click指令防止重复点击
2017/07/26 Javascript
HTML5开发Kinect体感游戏的实例应用
2017/09/18 Javascript
axios异步提交表单数据的几种方法
2019/08/11 Javascript
教你学会使用Python正则表达式
2017/09/07 Python
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
Django logging配置及使用详解
2019/07/23 Python
基于python实现从尾到头打印链表
2019/11/02 Python
Django的CVB实例详解
2020/02/10 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
英国著名的药妆网站:Escentual
2016/07/29 全球购物
巴西婴儿用品商店:Bebe Store
2017/11/23 全球购物
水果花束:Fruit Bouquets
2017/12/20 全球购物
施华洛世奇韩国官网:SWAROVSKI韩国
2018/06/05 全球购物
欧洲最大的预定车位市场:JustPark
2020/01/06 全球购物
俄罗斯便宜的在线服装商店:GroupPrice
2020/04/10 全球购物
小学生开学感言
2014/02/28 职场文书
物流专业求职信
2014/06/30 职场文书
机械工程及其自动化专业求职信
2014/08/08 职场文书
物流管理专业推荐信
2014/09/06 职场文书
2014年财务经理工作总结
2014/12/08 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
困难补助申请报告
2015/05/19 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
CSS实现背景图片全屏铺满自适应的3种方式
2022/07/07 HTML / CSS
Android移动应用开发指南之六种布局详解
2022/09/23 Java/Android