解决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 相关文章推荐
main.php
Dec 09 PHP
解析yahoo邮件用phpmailer发送的实例
Jun 24 PHP
ThinkPHP之A方法实例讲解
Jun 20 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
Nov 07 PHP
php使用fsockopen函数发送post,get请求获取网页内容的方法
Nov 15 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
Dec 23 PHP
thinkPHP5.0框架模块设计详解
Mar 18 PHP
PHP实现数组转JSon和JSon转数组的方法示例
Jun 14 PHP
PHP按一定比例压缩图片的方法
Oct 12 PHP
PHP随机数函数rand()与mt_rand()的讲解
Mar 25 PHP
PHP INT类型在内存中占字节详解
Jul 20 PHP
PHP命令行与定时任务
Apr 01 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中递归的实现实例详解
2017/11/14 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
2012/01/15 Javascript
PHP 数组current和next用法分享
2015/03/05 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
2016/04/05 Javascript
JS封装的自动创建表格的实现代码
2016/06/15 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
JS实现的验证身份证及获取地区功能示例
2017/01/16 Javascript
原生javascript实现读写CSS样式的方法详解
2017/02/20 Javascript
vue + socket.io实现一个简易聊天室示例代码
2017/03/06 Javascript
Angularjs上传文件组件flowjs功能
2017/08/07 Javascript
javascript变量提升和闭包理解
2018/03/12 Javascript
webpack 打包压缩js和css的方法示例
2018/03/20 Javascript
vue-cli2打包前和打包后的css前缀不一致的问题解决
2018/08/24 Javascript
详解JavaScript原生封装ajax请求和Jquery中的ajax请求
2019/02/14 jQuery
vue实现在线预览pdf文件和下载(pdf.js)
2019/11/26 Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
2020/03/14 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
python 输出一个两行字符的变量
2009/02/05 Python
python发送arp欺骗攻击代码分析
2014/01/16 Python
python使用cookie库操保存cookie详解
2014/03/03 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
python多线程调用exit无法退出的解决方法
2019/02/18 Python
Python自定义一个异常类的方法
2019/06/27 Python
python 使用socket传输图片视频等文件的实现方式
2019/08/07 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
Python实现投影法分割图像示例(一)
2020/01/17 Python
keras-siamese用自己的数据集实现详解
2020/06/10 Python
西尔斯百货官网:Sears
2016/09/06 全球购物
年终考核实施方案
2014/05/26 职场文书
整改落实自查报告
2014/11/05 职场文书
保送生自荐信范文
2015/03/26 职场文书
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
python 实现图片特效处理
2022/04/03 Python