我尝试将一个大的JSON块(100k)打印到浏览器,但服务器在没有错误的情况下失败.
例如:
echo’var config =’. json_encode($config). ‘;’ . PHP_EOL;
我发现如果我送一小块,那就没事了.
我发现如果我在JSON字符串中放置换行符,即使字符串是400k也没关系.
例如:
$config_json = json_encode($config);
$config_json = str_replace(‘},’,’},’.PHP_EOL,$config_json);
echo’var config =’. $config_json. ‘;’ . PHP_EOL;
但是破坏线打破了我的JSON.
那么,如果它是缓冲区设置,为什么PHP_EOL有帮助?
我也尝试将JSON分成像这样的部分:https://stackoverflow.com/a/19156563/1009525,但没有成功,只有breaklines帮助我.
the server fails without an error
我认为你的意思是服务器向客户端发送响应(状态代码:200 – 没有错误),但响应主体(内容)是空的(这是失败).
您应该检查这一点,因为如果实际上服务器发送带有内容的响应,则问题不在于PHP,Nginx或缓冲.
否则(如评论中所建议的)可能是JSON而不是< script> – < / script>块可以包裹在< pre>之间.标签,这可能是问题(但除非你发布更多的代码,否则我无法帮助).
从现在开始,我假设从服务器发送的响应为空
您发布的代码是有效的,并且应该正确处理您正在构建的输出字符串(远远低于PHP限制).
说这似乎是一个奇怪的缓冲问题.我写“怪异”,因为据我所知(我也花时间做一些研究)缓冲不应该受到换行的影响.
I have found that if I put line breaks in the JSON string,it’s OK even if the string is 400k.
解决问题的快速解决方法是输出带有换行符的有效JSON.您只需要为json_encode指定一个选项:
echo 'var config = ' . json_encode( $config,JSON_PRETTY_PRINT ) . ';' . PHP_EOL;
JSON_PRETTY_PRINT告诉json_encode将json格式化为更易读,这样做会添加换行符.
(请注意,此选项适用于PHP 5.4.0及更高版本)
我希望上述解决方案适合您.
无论如何,我强烈建议您进一步调查此问题,以便让原始代码也能正常工作.