解决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 相关文章推荐
一个域名查询的程序
Oct 09 PHP
ajax php 实现写入数据库
Sep 02 PHP
php静态文件返回304技巧分享
Jan 06 PHP
php对象在内存中的存在形式分析
Feb 03 PHP
php构造函数的继承方法
Feb 09 PHP
Mac环境下php操作mysql数据库的方法分享
May 11 PHP
PHP7.0安装笔记整理
Aug 28 PHP
PHP随机数 C扩展随机数
May 04 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 PHP
php5.6.x到php7.0.x特性小结
Aug 17 PHP
PHP 自动加载类原理与用法实例分析
Apr 14 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 13 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
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
DC四月将推出百页特刊漫画 纪念小丑诞生80周年
2020/04/09 欧美动漫
mysql建立外键
2006/11/25 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
PHP实现微信小程序人脸识别刷脸登录功能
2018/05/24 PHP
PHP中如何使用Redis接管文件存储Session详解
2018/11/28 PHP
关于js datetime的那点事
2011/11/15 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
跨域传值即主页面与iframe之间互相传值
2013/12/09 Javascript
jQuery之字体大小的设置方法
2014/02/27 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
一道常被人轻视的web前端常见面试题(JS)
2016/02/15 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
nodejs实现爬取网站图片功能
2017/12/14 NodeJs
node中modules.exports与exports导出的区别
2018/06/08 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
2019/05/07 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
Python模仿POST提交HTTP数据及使用Cookie值的方法
2014/11/10 Python
详解django.contirb.auth-认证
2018/07/16 Python
pycharm执行python时,填写参数的方法
2018/10/29 Python
python学生信息管理系统实现代码
2019/12/17 Python
python+requests接口自动化框架的实现
2020/08/31 Python
泰国第一的化妆品网站:Konvy
2018/02/25 全球购物
学生的自我鉴定范文
2013/10/24 职场文书
经理职责范文
2013/11/08 职场文书
幼儿园大班新学期寄语
2014/01/18 职场文书
团日活动总结模板
2014/06/25 职场文书
目标责任书格式
2014/07/28 职场文书
计生工作先进事迹
2014/08/15 职场文书
事业单位个人查摆问题及整改措施
2014/10/28 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书