2

我使用 Laravel,将 db 行加载到 Eloquent 对象中。其中一列是 longtext,一个 JSON 编码的数组,长度 > 200 万个字符。我得到的原始错误是 json_decode 在此列的值上失败。

我在修补程序中进行了测试。简化测试代码:

$item = Item::find(1);
echo $item->long_text_field;
var_dump(json_decode($item->long_text_field));
echo strlen($item->long_text_field);

在我的本地 vagrant 实例上,这显示了正确的值。

...long json array in text, same as the value in the actual DB entry...
...var_dump of json array...
2334040

但是在我的远程开发服务器上,我得到了

...long json array truncated in the middle...
NULL
1048576

显然 json_decode 失败,因为字符串被截断。

它像这样截断

"Eff Date":"1\”

应该是哪个

"Eff Date":"1\/30\/14 16:13”

长文本中有很多像这样的转义斜杠,我当时看不到任何奇怪的字符。有谁知道为什么这个文本会在一台服务器上截断,而不是另一台?

4

2 回答 2

8

问题是默认PDO::MYSQL_ATTR_MAX_BUFFER_SIZE大小是 1Mb。

要在 Laravel 中进行设置,您需要在 database.php 配置文件中添加一个选项。

'connections' => [
    'mydb' => [
        'driver'    => 'mysql',
        'host'      => 'localhost',
        'database'  => 'mydb',
        'options'   => [
            PDO::MYSQL_ATTR_MAX_BUFFER_SIZE => 16777216
        ]
    ]
]

以上将最大属性大小设置为 16Mb。

请注意,如果您使用的是 mysqlnd 驱动程序,则不再需要它,它实际上会破坏您的代码,因为 PDO::MYSQL_ATTR_MAX_BUFFER_SIZE 常量不存在。

于 2015-10-08T07:24:02.190 回答
0

问题可能出在 json_encoding 阶段,甚至在您检索结果之前。

尝试通过以下方式禁用正斜杠转义:

$str = "1/30/14 16:13";
echo json_encode($str, JSON_UNESCAPED_SLASHES);

很可能,这是启用了 magic_quotes_gpc 的症状(意味着您可能使用的是 PHP 版本 < 5.2);

来自 PHP 手册:

; Magic quotes
;

; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off

If access to the server configuration is unavailable, use of .htaccess is also an option. For example:

php_flag magic_quotes_gpc Off
于 2014-10-03T18:02:31.520 回答