没有断行不能输出大的字符串块(nginx + php)

时间:2017-04-03 07:56:56

标签: php json nginx

我尝试将一个大的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,但没有成功,只有分隔符可以帮助我。

3 个答案:

答案 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)

答案 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;