2013-04-08 113 views
3

我注意到,我正在开发被打破了应用程序,我设法将它缩小到这个问题(我已经建立了一个测试案例吧):PHP:长字符串,json_encode,后续代码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响应。

+0

你确定这不是你的浏览器,因为巨大的转储损坏? – Uby 2013-04-08 09:52:42

+0

我不这么认为,如果我可以成功地echo/var_dump一个字符串,只是成功var_dump数组,为什么我不能回显数组呢?关于浏览器限制。 – Jeremy 2013-04-08 09:56:29

+0

从外部检查浏览器源代码(不是通过萤火虫等),你可能会看到代码 – 2013-04-08 09:57:40

回答

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

我没有外部检查浏览器源代码在那里,谢谢您的意见他们没有导致我在正确的方向!