我如何解决“ Illuminate \ Queue \ InvalidPayloadException:无法以JSON编码有效负载错误代码:5”

问题描述

使用Laravel-Excel试用队列系统以获得更好的用户上传体验。

.env已从“同步”更改为“数据库”并运行迁移。所有必要的use语句均已就绪,但以上错误仍然存​​在。

确切的错误在这里发生:

Illuminate\Queue\Queue.php:97
        $payload = json_encode($this->createPayloadArray($job,$queue,$data));
                if (JSON_ERROR_NONE !== json_last_error()) {
                            throw new InvalidPayloadException(

如果我放弃ShouldQueue,文件将在会话期间完美导入(大文件,因此用户等待时间长。)

我已经阅读了很多关于stackoverflow,github等的评论,但是我没有深入解决我的特殊情况的技术技能(他们大多数都谈到UTF-8,但是如果那是一个问题;我将excel保存格式更改为UTF-8,但没有解决。)

Ps。运行迁移时,出现错误:

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `jobs` add index `jobs_queue_index`(`queue`))

我通过删除“添加索引”来绕过;因此我的工作表未在队列中建立索引,但我不认为这是原因。

解决方法

使用json_last_error_msg()函数可以发现json_encode()错误,这是您可以做的一件事。

在您的情况下,您会得到一个'5'的错误代码,即JSON_ERROR_UTF8。返回的错误消息为此提供了更多信息:

“格式错误的UTF-8字符,可能编码错误”

因此,即使您使用UTF-8编码专门保存文件,我们也知道它遇到了非UTF-8字符。乍一看,您可能会认为您需要自己将编码转换为代码(例如this answer),但是在这种情况下,我认为这无济于事。对于Laravel-Excel,这似乎是尝试从the Laravel-Excel docs中读取.xls文件的队列限制:

您当前无法将xls导入排队。 PhpSpreadsheet的Xls阅读器包含一些非utf8字符,因此无法排队。

在这种情况下,您可能会遇到一个缓慢且无法排队的选项,或者需要将电子表格转换为可排队的格式,例如.csv

运行迁移时的密钥长度错误无关。它已经存在了一段时间,并且是使用旧版本的MySQL / MariaDB的副作用。检出this answerLaravel documentation周围的索引长度-您需要将其添加到AppServiceProvider::boot()方法中

Schema::defaultStringLength(191);

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...