解决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学习之PHP表达式
Oct 09 PHP
mysq GBKl乱码
Nov 28 PHP
PHP IN_ARRAY 函数使用注意事项
Jul 24 PHP
apache mysql php 源码编译使用方法
May 03 PHP
$_GET['goods_id']+0 的使用详解
Jun 06 PHP
PHP在不同页面间传递Json数据示例代码
Jun 08 PHP
使用php测试硬盘写入速度示例
Jan 27 PHP
php打印一个边长为N的实心和空心菱型的方法
Mar 02 PHP
php实现mysql数据库分表分段备份
Jun 18 PHP
PHP编写daemon process 实例详解
Nov 13 PHP
PHP中CheckBox多选框上传失败的代码写法
Feb 13 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
Jan 23 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下网站防IP攻击代码,超级实用
2010/10/24 PHP
PHP--用万网的接口实现域名查询功能
2012/12/13 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
2014/04/10 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
php安装swoole扩展的方法
2015/03/19 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
2018/08/17 PHP
jquery层级选择器的实现(匹配后代元素div)
2016/09/05 Javascript
详解基于javascript实现的苹果系统底部菜单
2016/12/02 Javascript
javascript使用递归算法求两个数字组合功能示例
2017/01/03 Javascript
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
使用FileReader API创建Vue文件阅读器组件
2018/04/03 Javascript
ES6中字符串的使用方法扩展
2019/06/04 Javascript
Windows下PyMongo下载及安装教程
2015/04/27 Python
python 中的int()函数怎么用
2017/10/17 Python
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
Python 点击指定位置验证码破解的实现代码
2019/09/11 Python
django 实现简单的插入视频
2020/04/07 Python
python 将列表里的字典元素合并为一个字典实例
2020/09/01 Python
Python之qq自动发消息的示例代码
2021/02/18 Python
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
如何写出高性能的JSP和Servlet
2013/01/22 面试题
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
路政管理专业推荐信
2013/11/11 职场文书
文明家庭先进事迹材
2014/01/27 职场文书
军训鉴定表自我鉴定
2014/02/13 职场文书
实习会计求职自荐信范文
2014/03/10 职场文书
小学安全汇报材料
2014/08/14 职场文书
新娘婚礼致辞
2015/07/27 职场文书
《花钟》教学反思
2016/02/17 职场文书
《水上飞机》教学反思
2016/02/20 职场文书
2019年图书室自查报告范本
2019/10/12 职场文书
Go 在 MongoDB 中常用查询与修改的操作
2021/05/07 Golang
理解python中装饰器的作用
2021/07/21 Python
基于Python实现射击小游戏的制作
2022/04/06 Python