解决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 相关文章推荐
收集的DedeCMS一些使用经验
Mar 17 PHP
PHP 编程安全性小结
Jan 08 PHP
利用PHP生成静态HTML文档的原理
Oct 29 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
Aug 09 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
Nov 26 PHP
PHP exif扩展方法开启详解
Jul 28 PHP
PHPUnit安装及使用示例
Oct 29 PHP
PHP实现的简易版图片相似度比较
Jan 07 PHP
5款适合PHP使用的HTML编辑器推荐
Jul 03 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
Nov 20 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
May 02 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/03/04 星际争霸
PHP警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
PHP 代码规范小结
2012/03/08 PHP
PHP以及MYSQL日期比较方法
2012/11/29 PHP
PHP命名空间(Namespace)的使用详解
2013/05/04 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
PHP常用编译参数中文说明
2014/09/27 PHP
php基于Snoopy解析网页html的方法
2015/07/09 PHP
php如何获取Http请求
2020/04/30 PHP
Centos7.7 64位利用本地完整安装包安装lnmp/lamp套件教程
2021/03/09 Servers
javascript加号"+"的二义性说明
2013/03/04 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
基于JavaScript实现随机颜色输入框
2016/12/10 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
Vue 设置axios请求格式为form-data的操作步骤
2019/10/29 Javascript
vue限制输入框只能输入8位整数和2位小数的代码
2019/11/06 Javascript
基于javascript实现放大镜特效
2020/12/03 Javascript
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
Mac中Python 3环境下安装scrapy的方法教程
2017/10/26 Python
浅谈Python实现Apriori算法介绍
2017/12/20 Python
python 利用文件锁单例执行脚本的方法
2019/02/19 Python
Python学习笔记之While循环用法分析
2019/08/14 Python
flask 使用 flask_apscheduler 做定时循环任务的实现
2019/12/10 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
Swanson中国官网:美国斯旺森健康产品公司
2021/03/01 全球购物
信息管理专业学生自荐信格式
2013/09/22 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
上班迟到检讨书300字
2014/10/18 职场文书
2015年导购员工作总结
2015/04/25 职场文书
医生行业员工的辞职信
2019/06/24 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
浅谈redis整数集为什么不能降级
2021/07/25 Redis