我注意到我正在开发的应用程序正在破坏,我设法将其缩小到这个问题(我为它设置了一个测试用例):
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响应。
答案 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());
我确实在外部检查了浏览器源代码并且代码在那里,感谢您的评论,他们确实引导我朝着正确的方向前进!