解决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版(1)
Oct 09 PHP
PHP用户指南-cookies部分
Oct 09 PHP
php/js获取客户端mac地址的实现代码
Jul 08 PHP
php实现图片缩放功能类
Dec 18 PHP
php结合ajax实现赞、顶、踩功能实例
May 12 PHP
采用memcache在web集群中实现session的同步会话
Jul 05 PHP
php绘图之生成饼状图的方法
Jan 24 PHP
详解PHP实现执行定时任务
Dec 21 PHP
php自定义函数实现汉字转换utf8编码的方法
Sep 29 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
Oct 18 PHP
php正则表达式基本知识与应用详解【经典教程】
Apr 17 PHP
Laravel5.7 Eloquent ORM快速入门详解
Apr 12 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
全国FM电台频率大全 - 16 河南省
2020/03/11 无线电
关于PHP的相似度计算函数:levenshtein的使用介绍
2013/04/15 PHP
CodeIgniter针对数据库的连接、配置及使用方法
2016/03/03 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
PHP实现留言板功能的详细代码
2017/03/25 PHP
Javascript & DHTML 实例编程(教程)DOM基础和基本API
2007/06/02 Javascript
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
2012/09/02 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
2013/08/29 Javascript
javascript在子页面中函数无法调试问题解决方法
2014/01/17 Javascript
javascript中几个容易混淆的概念总结
2015/04/14 Javascript
javascript实现判断鼠标的状态
2015/07/10 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
Angular2学习教程之组件中的DOM操作详解
2017/05/28 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
2017/07/07 Javascript
vue获取DOM元素并设置属性的两种实现方法
2017/09/30 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
2020/07/18 Javascript
[00:02]DOTA2新版本使用PA至宝后暴击展示
2014/11/19 DOTA
[55:56]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
2014/04/25 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
详谈python在windows中的文件路径问题
2018/04/28 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
Python IDE环境之 新版Pycharm安装详细教程
2020/03/05 Python
Python求解排列中的逆序数个数实例
2020/05/03 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
学生发电厂实习自我鉴定
2013/09/22 职场文书
学习经验演讲稿
2014/05/10 职场文书
向国旗敬礼学生寄语大全
2014/09/30 职场文书
MySql重置root密码 --skip-grant-tables
2022/04/11 MySQL
PostgreSQL怎么创建分区表详解
2022/06/25 PostgreSQL