解决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 相关文章推荐
十天学会php(2)
Oct 09 PHP
PHP生成网页快照 不用COM不用扩展.
Feb 11 PHP
php trim 去除空字符的定义与语法介绍
May 31 PHP
php HandlerSocket的使用
May 02 PHP
smarty巧妙处理iframe中内容页的代码
Mar 07 PHP
PHP命名空间(Namespace)的使用详解
May 04 PHP
浅谈PHP变量作用域以及地址引用问题
Dec 27 PHP
php自定义函数截取汉字长度
May 15 PHP
PHP实现PDO的mysql数据库操作类
Dec 12 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
php使用curl伪造浏览器访问操作示例
Sep 30 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
Oct 03 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
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
javascript 单选框,多选框美化代码
2008/08/01 Javascript
JavaScript setTimeout和setInterval的使用方法 说明
2010/03/25 Javascript
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
基于jquery的滚动条滚动固定div(附演示下载)
2012/10/29 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
jQuery中RadioButtonList的功能及用法实例介绍
2013/08/23 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
简单方法判断JavaScript对象为null或者属性为空
2014/09/26 Javascript
一款基jquery超炫的动画导航菜单可响应单击事件
2014/11/02 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
js窗口关闭提示信息(兼容IE和firefox)
2015/10/23 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
代码整洁之道(重构)
2018/10/25 Javascript
[04:23]DOTA2上海特锦赛小组赛第一日 TOP10精彩集锦
2016/02/27 DOTA
用Python进行基础的函数式编程的教程
2015/03/31 Python
python递归计算N!的方法
2015/05/05 Python
转换科学计数法的数值字符串为decimal类型的方法
2018/07/16 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
2018/10/29 Python
python与C、C++混编的四种方式(小结)
2019/07/15 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
基于TensorFlow常量、序列以及随机值生成实例
2020/01/04 Python
python文件和文件夹复制函数
2020/02/07 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
JAKO-O德国野酷台湾站:德国首屈一指的婴幼童用品品牌
2019/01/14 全球购物
大专生自荐信
2013/10/04 职场文书
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
酒店总经理助理岗位职责
2014/02/01 职场文书
护士毕业实习感言
2014/03/05 职场文书
家具商场的活动方案
2014/08/16 职场文书
分析Netty直接内存原理及应用
2021/06/14 Java/Android