解决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静态类
Nov 25 PHP
收集的php编写大型网站问题集
Mar 06 PHP
php 图片上传类代码
Jul 17 PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
May 16 PHP
深入PHP异步执行的详解
Jun 03 PHP
PHP cdata 处理(详细介绍)
Jul 05 PHP
php获取数组长度的方法(有实例)
Oct 27 PHP
php中hashtable实现示例分享
Feb 13 PHP
实现获取http内容的php函数分享
Feb 16 PHP
php通过淘宝API查询IP地址归属等信息
Dec 25 PHP
php实现xml转换数组的方法示例
Feb 03 PHP
PHP时间函数使用详解
Mar 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
php 采集书并合成txt格式的实现代码
2009/03/01 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
2012/09/25 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
PHP框架Laravel的小技巧两则
2015/02/10 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
PHP之多条件混合筛选功能的实现方法
2019/10/09 PHP
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
在js中实现邮箱格式的验证方法(推荐)
2016/10/24 Javascript
JQuery和PHP结合实现动态进度条上传显示
2016/11/23 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
nodejs使用redis作为缓存介质实现的封装缓存类示例
2018/02/07 NodeJs
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
vue-cli3中vue.config.js配置教程详解
2019/05/29 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
2020/04/27 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
django基础之数据库操作方法(详解)
2017/05/24 Python
python3 爬取图片的实例代码
2018/11/06 Python
python3去掉string中的标点符号方法
2019/01/22 Python
pandas DataFrame 删除重复的行的实现方法
2019/01/29 Python
numpy基础教程之np.linalg
2019/02/12 Python
Python实现爬取马云的微博功能示例
2019/02/16 Python
Html5 FileReader实现即时上传图片功能实例代码
2014/09/01 HTML / CSS
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
中学教师自我鉴定
2014/02/07 职场文书
厂办主管岗位职责范本
2014/02/28 职场文书
食品安全工作实施方案
2014/03/26 职场文书
班级旅游计划书
2014/05/03 职场文书
学前教育专业求职信
2014/09/02 职场文书
2014年党小组工作总结
2014/12/20 职场文书
计算机专业自荐信
2015/03/05 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
2016年国培研修日志
2015/11/13 职场文书