我尝试将一个大的JSON块(100k)打印到浏览器,但是服务器在没有错误的情况下失败。
例如:
echo 'var config = ' . json_encode( $config ) . ';' . PHP_EOL;
我发现如果我寄一小块,那就OK了。 我发现如果我在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,但没有成功,只有分隔符可以帮助我。
答案 0 :(得分:2)
写作时
服务器发生故障而没有错误
我认为你的意思是服务器向客户端发送响应(状态代码:200 - 没有错误),但响应正文(内容)为空(这是失败)。
你应该检查一下,因为如果实际上服务器发送带有内容的响应 ,则问题不在于php,nginx或缓冲。
否则(如评论中所示)也许JSON而不是<script>
- </script>
块内可能包含在<pre>
标签之间,这可能是问题(但我可以&# 39;除非你发布更多代码,否则请提供帮助。
从现在开始,我假设服务器发送的响应是为空
您发布的代码是有效的,并且应该正确处理您正在构建的输出字符串(远远低于PHP限制)。
说这似乎是一个奇怪的缓冲问题。我写的很奇怪&#34;因为据我所知(我也花时间做一些研究)缓冲不应该受到换行的影响。
我发现如果我在JSON字符串中添加换行符,即使字符串为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及更高版本)
我希望上述解决方案适合您。
无论如何,我强烈建议您进一步调查此问题,以便让原始代码也能正常工作。
首先,您应确保自己运行 nginx 和 php 的最新稳定版本。
然后我会检查nginx配置文件,php-fpm配置(如果你使用php-fpm),最后是php配置。
同时检查php,nginx和php-fpm错误日志。
答案 1 :(得分:0)
尝试使用php heredoc回显http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc
答案 2 :(得分:0)
如果您没有PHP
版本&gt; 5.4.0安装在您的服务器上快速解决方法可能是这样的。以下代码段适用于测试数组。最初的测试是250Kb的阵列。由于我不能在这里发布实际的测试数组,因此test链接带有一个较小的示例。这是JSON_PRETTY_PRINT
的结果。
$out = json_encode($arr,JSON_FORCE_OBJECT);
$out = str_replace( ':{', ':' . PHP_EOL . ' ' . '{', $out );
$out = str_replace( '},', PHP_EOL . ' },', $out );
$out = str_replace( ',', ',' . PHP_EOL . ' ', $out );
$out = str_replace( '},' . PHP_EOL . ' ', '},' . PHP_EOL . ' ', $out );
$out = str_replace( '}}', PHP_EOL . ' }' . PHP_EOL . '}', $out );
echo $out;