解决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 应用程序安全防范技术研究
Sep 25 PHP
深入PHP获取随机数字和字母的方法详解
Jun 06 PHP
解析ajax事件的调用顺序
Jun 17 PHP
php计算数组不为空元素个数的方法
Jan 27 PHP
PHP中shuffle数组值随便排序函数用法
Nov 21 PHP
php导入excel文件到mysql数据库的方法
Jan 14 PHP
PHP实现的一致性哈希算法完整实例
Nov 14 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
May 18 PHP
php实现的中文分词类完整实例
Feb 06 PHP
yii2 resetful 授权验证详解
May 18 PHP
PHP容器类的两种实现方式示例
Jul 24 PHP
Mac下关于PHP环境和扩展的安装详解
Oct 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
PHP中改变图片的尺寸大小的代码
2011/07/17 PHP
解析php中memcache的应用
2013/06/18 PHP
XAMPP安装与使用方法详细解析
2013/11/27 PHP
Linux平台php命令行程序处理管道数据的方法
2016/11/10 PHP
根据分辨率不同,调用不同的css文件
2006/08/25 Javascript
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
vuejs动态组件给子组件传递数据的方法详解
2016/09/09 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
js中作用域的实例解析
2017/03/16 Javascript
nodejs6下使用koa2框架实例
2017/05/18 NodeJs
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
在vue项目中安装使用Mint-UI的方法
2017/12/27 Javascript
Element-UI中关于table表格的那些骚操作(小结)
2019/08/15 Javascript
Django验证码的生成与使用示例
2017/05/20 Python
python3实现UDP协议的服务器和客户端
2017/06/14 Python
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
Python爬虫入门教程01之爬取豆瓣Top电影
2021/01/24 Python
使用HTML5的链接预取功能(link prefetching)给网站提速
2012/12/13 HTML / CSS
加拿大时尚少女服装品牌:Garage
2016/10/10 全球购物
德国旅行、体验和活动的预订平台:Watado
2019/12/04 全球购物
成人毕业生自我鉴定
2013/10/18 职场文书
团支部推优材料
2014/05/21 职场文书
汽车维修专业自荐书
2014/05/26 职场文书
个人务虚会发言材料
2014/10/20 职场文书
2015年社区流动人口工作总结
2015/05/12 职场文书
2015年乡镇妇联工作总结
2015/05/19 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
解决Pytorch dataloader时报错每个tensor维度不一样的问题
2021/05/28 Python
Python实现机器学习算法的分类
2021/06/03 Python
一文搞懂redux在react中的初步用法
2021/06/09 Javascript