我使用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);
在我的本地流浪者实例上,它显示正确的值。
...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”
在长篇文章中有很多类似于逃避的斜线,在这一点上我没有看到任何奇怪的字符。有没有人知道为什么这个文本会在一台服务器而不是另一台服务器上截断?
答案 0 :(得分: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常量不存在。
答案 1 :(得分: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