解决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实现定时生成HTML网站首页实例代码
Nov 20 PHP
php date()日期时间函数详解
May 16 PHP
php站内搜索并高亮显示关键字的实现代码
Dec 29 PHP
php实现的短网址算法分享
Jun 20 PHP
php带抄送和密件抄送的邮件发送方法
Mar 20 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
May 12 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
Dec 24 PHP
PHP实现登陆表单提交CSRF及验证码
Jan 24 PHP
php 中的closure用法详解
Jun 12 PHP
PHP基于面向对象封装的分页类示例
Mar 15 PHP
Yii 框架使用数据库(databases)的方法示例
May 19 PHP
phpstudy隐藏index.php的方法
Sep 21 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
在MongoDB中模拟Auto Increment的php代码
2011/03/06 PHP
php实现的返回数据格式化类实例
2014/09/22 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
php实现的二分查找算法示例
2017/06/20 PHP
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
2015/12/01 Javascript
javascript中加var和不加var的区别 你真的懂吗
2016/01/06 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
2021/01/28 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
详解react-router4 异步加载路由两种方法
2017/09/12 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
2018/11/30 Javascript
利用d3.js实现蜂巢图表带动画效果
2019/09/03 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
python使用urllib2模块获取gravatar头像实例
2013/12/18 Python
Python 3中的yield from语法详解
2017/01/18 Python
python ansible服务及剧本编写
2017/12/29 Python
python reverse反转部分数组的实例
2018/12/13 Python
神经网络相关之基础概念的讲解
2018/12/29 Python
python+mysql实现教务管理系统
2019/02/20 Python
Python分析彩票记录并预测中奖号码过程详解
2019/07/09 Python
Python交互式图形编程的实现
2019/07/25 Python
python实现名片管理器的示例代码
2019/12/17 Python
python 实现一个图形界面的汇率计算器
2020/11/09 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
如何用python写个模板引擎
2021/01/14 Python
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
美国探亲签证邀请信
2014/02/05 职场文书
班主任班级寄语大全
2014/04/04 职场文书
小学生期末评语大全
2014/04/21 职场文书
詹天佑教学反思
2014/04/30 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
监守自盗观后感
2015/06/10 职场文书
【DOTA2】总决赛血虐~ XTREME GAMING vs MAGMA - OGA DOTA PIT 2022 CN
2022/04/02 DOTA