解决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安装攻略:常见问题解答(二)
Oct 09 PHP
使用TinyButStrong模板引擎来做WEB开发
Mar 16 PHP
如何用php获取文件名后缀
Jun 09 PHP
php加速器eAccelerator的配置参数、API详解
May 05 PHP
一个不易被发现的PHP后门代码解析
Jul 05 PHP
PHP中使用addslashes函数转义的安全性原理分析
Nov 03 PHP
php中文繁体和简体相互转换的方法
Mar 21 PHP
php返回相对时间(如:20分钟前,3天前)的方法
Apr 14 PHP
php动态绑定变量的用法
Jun 16 PHP
php简单实现短网址(短链)还原的方法(测试可用)
May 09 PHP
功能强大的PHP发邮件类
Aug 29 PHP
thinkphp5框架路由原理与用法详解
Feb 11 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
我常用的几个类
2006/10/09 PHP
php下获取客户端ip地址的函数
2010/03/15 PHP
从php核心代码分析require和include的区别
2011/01/02 PHP
强制PHP命令行脚本单进程运行的方法
2014/04/15 PHP
ThinkPHP让分页保持搜索状态的方法
2014/07/02 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
2013/01/11 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
浅谈Node.js:Buffer模块
2016/12/05 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
Textarea输入字数限制实例(兼容iOS&安卓)
2017/07/06 Javascript
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
[04:26]2014DOTA2国际邀请赛-Newbee顺利进入胜者组决赛 独家专访战神7
2014/07/19 DOTA
python2.7实现FTP文件下载功能
2018/04/15 Python
Python numpy实现二维数组和一维数组拼接的方法
2018/06/05 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
马来西亚最好的婴儿商店:Motherhood
2017/09/14 全球购物
WSDL的操作类型主要有几种
2013/07/19 面试题
乡镇干部十八大感言
2014/02/17 职场文书
民警个人对照检查剖析材料
2014/09/17 职场文书
学习党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
幼儿园小班个人工作总结
2015/02/12 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android
Java面试题冲刺第十五天--设计模式
2021/08/07 面试题
详解解Django 多对多表关系的三种创建方式
2021/08/23 Python
纯CSS打字动画的实现示例
2022/08/05 HTML / CSS