我目前正在构建一个从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);
我似乎无法弄清楚问题: - |
答案 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');
}
正如这段代码显然所示,它会告诉它自己执行哪个操作失败,因为在代码继续之前已经正确检查了每个操作的返回值。
当您在这里与外国数据进行交互时,这非常重要,因为数据中的错误可能会混合到您在此处的不同编码中:
在每个阶段都会出现故障,但你甚至没有检查原始代码。
接下来假设输入数据总是有问题,代码也会检查匹配,即您使用正义表达式解析的未知编码。因此,尽早找到错误的第一位非常重要。否则你可能会在错误的地方查找错误原因。