使用gzuncompress()解码xml输出:中的数据错误


decoding xml output using gzuncompress(): data error in

我目前正在构建一个从API提取数据的web应用程序。API使用XML作为接受请求和发送响应的形式。我让他的网络应用程序在我的WAMP服务器上运行得很好。我甚至将它部署在一个免费的PHP web服务器上进行测试,它可以无缝工作。然而,当我将其部署到实时服务器时,我在php日志文件中出现了以下错误。

2015年4月7日星期二17:28:12〕〔错误〕〔客户端94.236.7.190〕PHP通知:未定义的偏移量:1 in/home/jdsites/camping.blacks.co.uk/api.php on第214行〔星期二Apr 07 17:28:12015〕〔error〕〔client 94.236.7.190〕PHP警告:gzuncompress():数据错误/home/jdsites/camping.blacks.co.uk/api.php,电话:214〔Tue Apr 07 17:28:12015〕〔error〕〔client 94.236.7.190〕PHP注意:试图获取中非对象的属性/home/jdsites/camping.blacks.co.uk/api.php 89线〔Tue Apr 07 17:28:12015〕〔error〕〔client 94.236.7.190〕PHP注意:试图获取中非对象的属性/home/jdsites/camping.blacks.co.uk/api.php 89线〔Tue Apr 07 17:28:12015〕〔error〕〔client 94.236.7.190〕PHP注意:试图获取中非对象的属性/home/jdsites/camping.blacks.co.uk/api.php,电话:89

这是我的脚本中的PHP代码:

// decode the attachment data and this should return a valid xml string
line 214: $attachment_xml = gzuncompress(base64_decode($matches[1]));
line 215: $responseXml = new SimpleXMLElement($attachment_xml);

我似乎无法解决问题:-|

您的代码错过了基本错误检查(很抱歉这里的大胆:))。

// decode the attachment data and this should return a valid xml string
$attachment_xml = gzuncompress(base64_decode($matches[1]));
$responseXml = new SimpleXMLElement($attachment_xml);

这可能是工作的PHP代码,但只有在特定的情况下。这正是你所经历的:在你的WAMP盒子上,它很好,但在其他地方,它会吐出很多错误和警告。让我们先看看问题出在哪里:

$match = $matches[1];
if (!strlen($match)) {
    throw new UnexpectedValueException('No match found');
}
$compress = base64_decode($match);
if (false === $compress) {
    throw new RuntimeException('Failed to decode base64');
}
$uncompress = gzuncompress($compressed);
if (false === $uncompress) {
    throw new RuntimeException('Failed to gzuncompress');
}
$xml = simplexml_load_string($uncompress);
if (false === $xml) {
    throw new RuntimeException('Failed to parse XML');
}

正如这段代码明显显示的那样,它将自己判断执行的哪个操作失败,因为在代码继续之前,每个操作的返回值都经过了正确的检查。

当你在这里与外部数据交互时,这一点非常重要,因为数据中的错误可能会混合到你这里的不同编码中:

  • base64
  • gzip
  • XML

在每个阶段,有些东西都可能失败,但您甚至没有签入原始代码。

除了假设输入数据总是有错误之外,代码还检查匹配,也就是说,你正在使用的未知编码——我想是用正则表达式解析出来的。因此,尽早发现错误的第一个地方是很重要的。否则,你可能会找错地方,找出错误的原因。