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

时间:2015-04-10 10:00:27

标签: php xml gz

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

  

Apr Apr 07 17:28:12 2015] [错误] [客户端94.236.7.190] PHP通知:   未定义的偏移量:/home/jdsites/camping.blacks.co.uk/api.php中的1   第214行       [Tue Apr 07 17:28:12 2015] [错误] [客户端94.236.7.190] PHP警告:gzuncompress():数据错误   第214行/home/jdsites/camping.blacks.co.uk/api.php       [Tue Apr 07 17:28:12 2015] [错误] [客户端94.236.7.190] PHP注意:尝试获取非对象的属性   第89行/home/jdsites/camping.blacks.co.uk/api.php       [Tue Apr 07 17:28:12 2015] [错误] [客户端94.236.7.190] PHP注意:尝试获取非对象的属性   第89行/home/jdsites/camping.blacks.co.uk/api.php       [Tue Apr 07 17:28:12 2015] [错误] [客户端94.236.7.190] PHP注意:尝试获取非对象的属性   第89行/home/jdsites/camping.blacks.co.uk/api.php

这是我脚本中的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);

我似乎无法弄清楚问题: - |

1 个答案:

答案 0 :(得分:1)

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

// 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

在每个阶段都会出现故障,但你甚至没有检查原始代码。

接下来假设输入数据总是有问题,代码也会检查匹配,即您使用正义表达式解析的未知编码。因此,尽早找到错误的第一位非常重要。否则你可能会在错误的地方查找错误原因。