php - 使用 gzuncompress() 解码 xml 输出 : data error in

标签 php xml gzip

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

Tue Apr 07 17:28:12 2015] [error] [client 94.236.7.190] PHP Notice: Undefined offset: 1 in /home/jdsites/camping.blacks.co.uk/api.php on line 214 [Tue Apr 07 17:28:12 2015] [error] [client 94.236.7.190] PHP Warning: gzuncompress(): data error in /home/jdsites/camping.blacks.co.uk/api.php on line 214 [Tue Apr 07 17:28:12 2015] [error] [client 94.236.7.190] PHP Notice: Trying to get property of non-object in /home/jdsites/camping.blacks.co.uk/api.php on line 89 [Tue Apr 07 17:28:12 2015] [error] [client 94.236.7.190] PHP Notice: Trying to get property of non-object in /home/jdsites/camping.blacks.co.uk/api.php on line 89 [Tue Apr 07 17:28:12 2015] [error] [client 94.236.7.190] PHP Notice: Trying to get property of non-object in /home/jdsites/camping.blacks.co.uk/api.php on line 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

在每个阶段,某些事情都可能会失败,但您甚至没有 checkin 原始代码。

除了假设输入数据总是有错误之外,代码还会检查匹配情况,即您正在使用的未知编码,您可以从我猜测的正则表达式中解析出来。因此,尽早找到第一个错误位置非常重要。否则,您可能会在错误的位置查找错误原因。

关于php - 使用 gzuncompress() 解码 xml 输出 : data error in,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29558559/

相关文章:

java - 从 GZIPInputStream 读取大量字节

php - 从 DB2 数据库填充 MySQL 数据库

php - 无法使用 Laravel 4 测试带有前缀的路由

php - DDD,PHP。领域对象和业务逻辑

xml - xpath - 如果仅将 xml 文档放在一行上,则节点测试文本()不起作用

android - 如何在线性布局中居中适合图像?

SQL Server XML 添加属性(如果不存在)

web-services - WebService 的 IIS 压缩返回大字符串值

go - 解析 msgpack 编码单个 slice 的 msgpack 编码 slice 时为空 slice

php - token 中的段数错误 (OAuth Google Api)