2013-04-08 3 views
3

я заметил, что приложение я разрабатывал разрывалось, мне удалось сократить его до этой проблемы (я настроил тестовый пример для него):PHP: Длинные строки, json_encode, var_dump и эхо

ini_set("display_errors", "1"); 
error_reporting(E_ALL); 

error_log("[test] Memory limit: " . ini_get('memory_limit')); 
error_log("[test] Max Execution Time: " . ini_get('max_execution_time')); 

$testArray = array("abcdefghijklmnotuv..... 786998 characters later...ijklmEND"); 
$json = json_encode($testArray); 

var_dump($json); 
// echo($json); 

error_log("[test] Memory: ".memory_get_usage()."B"); 

Когда я var_dump переменного $ JSON, я получаю правильный вывод:

string(786998) "["abcdefghijklm....ijklmEND"]" 

Когда я эхо переменного $ JSON, вы можете очень кратко увидеть что-то появиться на экране, но затем он исчезает, конец ответ кажется должен быть NULL.

Если я повторяю выше со строкой вместо массива, то происходит то же самое.

Если я повторяю выше строку и опускаю шаг json_encode, все ведет себя так, как ожидалось, результаты var_dump и echo верны.

В течение всего процесса нет ошибок вывода в журнал ошибок, мои пределы памяти и не более времени выполнения также хорошо:

[test] Memory limit: 256M 
[test] Max Execution Time: 30 
[test] Memory: 2134296B 

Любые идеи?

Немного информации о моем приложении:

В двух словах есть два сервера. Сервер A отправляет HTTP-запрос на сервер B, сервер B обрабатывает запрос и отправляет ответ обратно серверу A. Ответ всегда является кодированным JSON-массивом. Если одно из значений массива в ответе слишком длинное, сервер A получает ответ NULL.

+0

Вы уверены, что это не ваш браузер, который сломан из-за огромного дампа? – Uby

+0

Я так не думаю, если я могу успешно выполнить echo/var_dump строку, которая так же длинна, успешно var_dump массив, почему бы мне не удастся также эхо-массива? Что касается ограничений браузера. – Jeremy

+0

проверить внешний источник браузера (не через firebug и т. Д.), Вы, вероятно, увидите код там –

ответ

1

Оказывается, проблема не связана с сервером B, это был сервер А.

Сервер реализован в Java с использованием API Netty.

HTTP-ответ был слишком длинным, и он был помечен, и у меня не было HttpChunkAggregator в моем конвейере, как только я добавил его во всем было хорошо.

ClientBootstrap cb = new ClientBootstrap(cf); 

cb.getPipeline().addLast("codec", new HttpClientCodec()); 
cb.getPipeline().addLast("chunkaggregator", new HttpChunkAggregator(1048576)); 
cb.getPipeline().addLast("inflater", new HttpContentDecompressor()); 
cb.getPipeline().addLast("handler", new OutboundHandler()); 

я проверить источник браузера внешне и код был там, спасибо за ваши комментарии они привели меня в правильном направлении!

Смежные вопросы