HTTPS PHP大型XML有效负载无法通过echo到达客户端

时间:2015-04-23 15:18:33

标签: php ios xml ssl https

我们的网络服务遇到了一些客户的大问题。 Web服务是SSL下的PHP脚本,它使用GET参数在MySQL数据库上配置多个重度查询并返回XML有效负载。有效载荷仅为1 MB,但处理非常复杂,大约需要5-6分钟才能完成。客户端是运行特定应用程序的iPad。有时,在某些网络上,客户端不会收到有效负载并一直等到超时。我们开始在服务器上记录所有内容。正常的response_ssl报告服务有效负载大约290秒,但是当问题发生时,我们可以看到相同有效负载的900秒。但是,即使在900秒后,客户端也不会收到有效负载。

在PHP脚本中,我们有一些调试日志记录:

[perform long-time operation]
[create XML dom]
$xmlPayload=$dom->saveXML();
LOG: "Start print XML"
echo $xmlPayload;
LOG: "End print XML"

当问题发生时,我们可以找到"开始打印XML"在日志文件中,但"结束打印XML"永远不会附加。似乎php脚本退出或冻结。我们尝试在PHP中激活log_error,没有通知,警告也没有记录错误!

我们无法访问遇到问题的客户端,也无法访问客户端(我们在每个方案中都尝试过)。受影响的客户端没有共同的模式(不同的网络,不同的iOS版本,不同的iPad版本等)。我们想知道如何调试这个恼人的问题!关于如何调试"冻结"的任何想法回声?谢谢!

1 个答案:

答案 0 :(得分:0)

我无法完全回答你的问题,因为根据你的错误描述,不清楚会发生什么。

如果PHP崩溃,通常应该出现一条错误消息,这些消息最常被记录(因为您启用了错误日志记录)。一个例外是分段错误或者如果操作系统杀死进程而没有通知它(例如某些硬限制)。

即使我不能告诉你究竟出了什么问题,你也可以节省一些资源(如果确实存在一些硬限制,这可能有所帮助)。您可以通过直接将XML文档“保存”到标准输出来节省资源。这使您无需将XML存储到变量中,以便稍后回显:

[perform long-time operation]
[create XML dom]
LOG: "Start print XML"
$dom->save('php://output');
LOG: "End print XML"

这只是利用DOMDocument::save保存到“文件”,文件确实是标准输出的PHP流(与echo使用的目标相同),即php://output

希望这一小小的改变能使它发挥作用,否则所提供的信息或其引入的变化将为您揭示更多信息以解决问题。