【问题标题】:PHP fails on JSON encoding data from Aurora MySQLPHP 在来自 Aurora MySQL 的 JSON 编码数据上失败
【发布时间】:2019-07-01 13:34:50
【问题描述】:

我最近将一个应用程序从 MySQL 迁移到了 Amazon Aurora MySQL 服务。我的应用程序从该数据库中获取数据并使用它来搜索 Elasticsearch 索引之一。

PHP Elasticsearch 库的底层 HTTP 客户端将查询数据编码为 JSON,然后发送到 Elasticsearch 服务器。我发现有时json_encode 调用失败并在传递从数据库检索的数据时返回false。这是随机发生的,所以我找不到确切的原因。

我的发现如下:

  1. 从数据库中检索到的数据有时包含二进制字符串,json_encode 在将这些数据传递给它时会失败。
  2. 我们在数据库级别使用 UTF8 编码,因此这不是问题。

Screenshot of database response

这里有人遇到过类似的 Aurora 或 MySQL 数据库问题,还是只是 PHP 本身的问题?

【问题讨论】:

  • 所以你是说应该包含JSON字符串的数据库列有时包含二进制数据,对吧?
  • 我将从检查数据库开始。迁移数据库时是否出现了此二进制数据,或者您的某些代码中是否存在存储二进制数据的 Opps
  • 你不能把责任归咎于 PHP 的 json_encode() 未能转换它从未设计为转换的数据
  • 否,数据库列仅包含搜索文本。然后,我们将 Elasticsearch 查询构建为一个数组,然后将其传递给 PHP Elasticsearch 客户端库。该库的底层实现使用json_encode 对其进行编码,然后再发送到 Elasticsearch 服务器。
  • 另外,是的,这些问题是在应用程序迁移到 Aurora MySQL 之后出现的。

标签: php mysql json elasticsearch amazon-aurora


【解决方案1】:

在使用 php 和 mysql 时永远不要假设任何事情...... 8/10 你在想什么不是问题......是问题......

那么,试试这个:

强制编码

function array_utf8_encode($dat){
        if (is_string($dat))
            return utf8_encode($dat);
        if (!is_array($dat))
            return $dat;
        $ret = array();
        foreach ($dat as $i => $d)
            $ret[$i] = self::array_utf8_encode($d);
        return $ret;
 }

$my_db_arr = array_utf8_encode($my_db_arr);

// Now let's encode
$json = json_encode($my_db_arr);

注意函数 array_utf8_encode 不是我的...但老实说我不记得我在 stackOverflow 上的哪里找到它...否则我会将链接和相关学分...

是否有一些错误?

var_dump(json_last_error_msg());

json_last_error_msg()

祝你有美好的一天,

安东尼奥

【讨论】:

  • 问题在于它并不总是无法对数据进行编码。大多数情况下,它成功地编码为 JSON。这只会随机发生。
  • 然后尝试离开json_last_error_msg,这样就可以知道为什么失败了
【解决方案2】:

看起来这是 AWS Aurora 本身的问题。另一个人也遇到了类似的问题,AWS 支持团队告诉他,这已经在全球范围内解决了。

Link to reddit comment.

【讨论】:

    猜你喜欢
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    相关资源
    最近更新 更多