PHP:长字符串,json_encode,var_dump和echo

时间:2013-04-08 09:50:14

标签: php echo json 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向服务器B发送HTTP请求,服务器B处理该请求并将响应发送回服务器A.响应始终是JSON编码的数组。如果响应中数组的某个值太长,则服务器A会收到NULL响应。

1 个答案:

答案 0 :(得分:1)

事实证明问题与服务器B没有关系,它是服务器A.

服务器A使用Netty API在Java中实现。

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());

我确实在外部检查了浏览器源代码并且代码在那里,感谢您的评论,他们确实引导我朝着正确的方向前进!