3

我注意到我正在开发的应用程序正在崩溃,我设法将其缩小到这个问题(我已经为它设置了一个测试用例):

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 响应。

4

1 回答 1

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

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

于 2013-04-09T02:52:56.817 回答