【问题标题】:How Do I resolve "Illuminate\Queue\InvalidPayloadException: Unable to JSON encode payload. Error code: 5"如何解决“Illuminate\Queue\InvalidPayloadException:无法对有效负载进行 JSON 编码。错误代码:5”
【发布时间】:2020-08-31 18:29:08
【问题描述】:

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

.env 已从“同步”更改为“数据库”并运行迁移。所有必要的使用语句都已到位,但上述错误仍然存​​在。

确切的错误发生在这里:

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 等 cmets,但我没有深入研究解决我的特定情况的技术技能(他们中的大多数人都在谈论 UTF-8,但如果那是问题在这里;我将excel保存格式更改为UTF-8,但没有解决。)

附言。在运行迁移时,我收到了错误:

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`))

我通过删除“添加索引”绕过了;所以我的作业表没有在队列中编入索引,但我不认为这是原因。

【问题讨论】:

  • 我 var_dumped 并注意到 $data 为空,$queue 是一个值为“default”的字符串,$job 是一个巨大的对象,代表分块的 excel 导入。搜索表明摆弄 utf8_encode、mb_convert_encoding 和 iconv 但这将涉及更改框架代码(并且不清楚它如何不会搞砸,例如在解码过程中。

标签: laravel-7 laravel-excel php-7.3 laravel-queue


【解决方案1】:

查看json_encode() 错误时可以做的一件事是使用json_last_error_msg() 函数,它会为您提供更多可读的错误消息。

在您的情况下,您会得到一个“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 answer 和索引长度周围的Laravel documentation - 您需要将其添加到您的AppServiceProvider::boot() 方法中:

Schema::defaultStringLength(191);

【讨论】:

  • 从此放弃 laravel-excel 直接通过 spout 写。我的回忆最初让我失望,但在故障排除中我实际上转换为 xlsx 并且问题保持不变。
  • @user1729972 我认为“Xls”阅读器适用于 xls 和 xlsx,可能需要为 csv 才能排队。对于 CSV,还有 league/csv,但他们似乎还没有 xls(x) 包。如果您想排队 xlsx 解析,它可能只是一个定制选项 - 或者贡献您自己的修改/包来做到这一点! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 2020-06-13
  • 2017-10-12
  • 2014-08-16
  • 2021-08-30
  • 2020-09-18
  • 2020-02-08
相关资源
最近更新 更多