Я использую Laravel, загружая строку БД в объект Eloquent. Один из столбцов — это длинный текст, массив в кодировке JSON длиной более 2 миллионов символов. Первоначальной ошибкой, которую я получал, был сбой 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”
В длинном тексте есть много экранированных слэшей, и в этот момент я не вижу странных символов. У кого-нибудь есть идея, почему этот текст будет обрезаться так на одном сервере, а не на другом?
Проблема по умолчанию 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
]
]
]
Выше будет установлен максимальный размер атрибута 16 МБ.
Обратите внимание, что если вы используете драйвер mysqlnd, он вам больше не нужен, и он фактически нарушит ваш код, поскольку константа PDO :: MYSQL_ATTR_MAX_BUFFER_SIZE не существует.
Проблема может лежать на этапе 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