解决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 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
Oct 09 PHP
使用PHP和XSL stylesheets转换XML文档
Oct 09 PHP
如何做到多笔资料的同步
Oct 09 PHP
PHP面向对象编程快速入门
Dec 14 PHP
请离开include_once和require_once
Jul 18 PHP
php curl 上传文件代码实例
Apr 27 PHP
php文件扩展名判断及获取文件扩展名的N种方法
Sep 12 PHP
CodeIgniter框架验证码类库文件与用法示例
Mar 18 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 PHP
THINKPHP5.1 Config的配置与获取详解
Jun 08 PHP
php双向队列实例讲解
Nov 17 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 日漫
PHP获取url的函数代码
2011/08/02 PHP
php设计模式之观察者模式的应用详解
2013/05/21 PHP
Memcached常用命令以及使用说明详解
2013/06/27 PHP
php class类的用法详细总结
2013/10/17 PHP
php调用c接口无错版介绍
2014/03/11 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
2017/02/03 PHP
php 多个变量指向同一个引用($b = &$a)用法分析
2019/11/13 PHP
AngularJS入门教程之Hello World!
2014/12/06 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
2015/04/12 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
SeaJS中use函数用法实例分析
2017/10/10 Javascript
bootstrap轮播模板使用方法详解
2017/11/17 Javascript
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
微信小程序开发实现的IP地址查询功能示例
2019/03/28 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[01:01:18]VP vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python查找目录下指定扩展名的文件实例
2015/04/01 Python
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
Python urllib、urllib2、httplib抓取网页代码实例
2015/05/09 Python
Python文件操作,open读写文件,追加文本内容实例
2016/12/14 Python
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
python3正则模块re的使用方法详解
2020/02/11 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
Python基于pyjnius库实现访问java类
2020/07/31 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
浅析python连接数据库的重要事项
2021/02/22 Python
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
不开辟用于交换数据的临时空间,如何完成字符串的逆序
2012/12/02 面试题
Laravel的加密解密与哈希实例讲解
2021/03/24 PHP
小学少先队工作总结2015
2015/05/26 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书