【问题标题】:XML parsing error while installing aws sdk安装 aws sdk 时出现 XML 解析错误
【发布时间】:2014-07-16 15:02:43
【问题描述】:

我正在我的 Windows 机器(Win7 64 位)PHP v 5.5.12 上安装适用于 PHP 的 aws sdk。 我尝试使用 here 提到的所有 3 种方法,即 Composer、zip 和 PHAR。所有 3 种方法都给了我与以下相同的错误。

Warning: SimpleXMLElement::__construct(): Entity: line 1: parser error : Space required after the Public Identifier in C:\wamp\www\aws-sdk-php-master\src\Aws\Common\Exception\Parser\DefaultXmlExceptionParser.php on line 41

这是给出错误的函数

public function parse(RequestInterface $request, Response $response)
{
    $data = array(
        'code'       => null,
        'message'    => null,
        'type'       => $response->isClientError() ? 'client' : 'server',
        'request_id' => null,
        'parsed'     => null
    );

    if ($body = $response->getBody(true)) {
        $this->parseBody(new \SimpleXMLElement($body), $data); //THIS LINE GIVES ERROR
    } else {
        $this->parseHeaders($request, $response, $data);
    }

    return $data;
}

这是我尝试使用它的方法。

 error_reporting(E_ALL);
 define('AWS_KEY', 'MyAWSKEY');
 define('AWS_SECRET_KEY', 'MYSECRETKEY');
 define('HOST', 'http://localhost');   //tried changing host to diff values,but don't   
                                       //think thats the issue
// require the AWS SDK for PHP library
 require 'aws-autoloader.php';
 //require '../../aws.phar';

 use Aws\S3\S3Client;

 // Establish connection with an S3 client.
 $client = S3Client::factory(array(
'base_url' => HOST,
'key'      => AWS_KEY,
'secret'   => AWS_SECRET_KEY
));

$o_iter = $client->getIterator('ListObjects', array(
'Bucket' => 'mybucketname'
));

foreach ($o_iter as $o) {
   echo "{$o['Key']}\t{$o['Size']}\t{$o['LastModified']}\n";
} 

这是堆栈跟踪

 [17-Jul-2014 04:19:01 Europe/Paris] PHP Fatal error:  Uncaught exception 'Exception'  with message 'String could not be parsed as XML' in C:\wamp\www\aws-sdk-php-master\src\Aws\Common\Exception\Parser\DefaultXmlExceptionParser.php:41
Stack trace:
#0 C:\wamp\www\aws-sdk-php- master\src\Aws\Common\Exception\Parser\DefaultXmlExceptionParser.php(41): SimpleXMLElement- >__construct('<!DOCTYPE HTML ...')
#1 C:\wamp\www\aws-sdk-php-master\src\Aws\S3\Exception\Parser\S3ExceptionParser.php(33): Aws\Common\Exception\Parser\DefaultXmlExceptionParser->parse(Object(Guzzle\Http\Message\Request), Object(Guzzle\Http\Message\Response))
#2 C:\wamp\www\aws-sdk-php-master\src\Aws\Common\Client\ExpiredCredentialsChecker.php(61): Aws\S3\Exception\Parser\S3ExceptionParser->parse(Object(Guzzle\Http\Message\Request), Object(Guzzle\Http\Message\Response))
#3 C:\wamp\www\aws-sdk-php-master\vendor\guzzle\guzzle\src\Guzzle\Plugin\Backoff\AbstractBackoffStrategy.php(39): Aws\Common\Client\ExpiredCredentialsChecker->getDelay(0, Object(Guzzle\Http\Message\Request), Object(Guzzle\Http\Message\Resp in C:\wamp\www\aws-sdk-php-master\src\Aws\Common\Exception\Parser\DefaultXmlExceptionParser.php on line 41

尝试谷歌搜索并了解到可能是由于 php.ini 中的 magic_quotes 开启,但事实并非如此,实际上我的 ini 文件中没有 magic_quotes 本身。 检查堆栈跟踪,它显示相同的错误。我无法确定它是 系统问题还是某些配置问题,因为我得到了所有方法。 这是某些配置的问题吗?或者我错过了什么?

【问题讨论】:

  • 仅供参考:魔术引号已在 PHP 5.4 中删除(耶!)。在解决此问题时您应该做的是实际转储$body,以便您可以查看尝试解析为 XML 的内容(而不是 XML)。这应该提供更多的洞察力。如果您在转储后仍不确定,请将$body 的第一行添加到您的问题中。 (您可能正在解析带有错误消息而不是 XML 的 HTML 页面,比较 stackoverflow.com/q/14465945/367456 这还表明,如果您增加错误日志记录,您可以找到更多不转储 $body,因为 PHP 在错误消息中执行此操作)。
  • 您使用的是什么服务和操作?你能分享你实际执行操作的代码示例吗?
  • @JeremyLindblom 嘿,我已将代码添加到问题中。我正在尝试使用工厂加载方法使用 S3 客户端。我的自动加载器是默认的,因为我在这里使用了 composer。我认为我不需要改变它。

标签: php xml amazon-web-services xml-parsing


【解决方案1】:

哦,我明白了。您应该设置base_url 参数。通过设置该值,您告诉 SDK 将请求发送到您的本地主机,而不是实际的 S3 服务。您的本地主机返回 HTML,而不是 XML,这就是 SimpleXML 引发解析错误的原因。

要使用 S3,您应该提供您的凭据(keysecret),如果您有意不使用 S3 的默认区域,还可以选择提供 region。不要覆盖 base_url 值,这是 SDK 根据其对服务端点的了解在内部解析的内容。

注意:我们还鼓励用户使用凭据配置文件 profile 而不是显式凭据(keysecret),以便您可以将凭据存储在代码和项目之外的文件中,以防止意外的凭据泄漏(例如,将凭据提交到版本控制中)。 S3 page in the User Guide 将引导您了解如何正确创建客户端,并提供一个链接以了解有关凭据文件/配置文件的更多信息。

【讨论】:

  • 哦!!!我为什么不试试!! :P 对我来说很差。谢谢你的及时帮助!!!但我建议在HOST 参数旁边添加注释,说明不是强制性的或可以留空对初学者有帮助。作为 SDK 的作者,您可能可以做到。 :P
  • 是的,我已经浏览了文档中的配置文件,并且肯定会实施它。
  • 关于“我建议在 HOST 参数旁边添加一条评论,说明不是强制性的或可以留空”,哪个页面/部分是该消息的最佳位置?
  • define('HOST', ''); //Can be left blank 和一个可能指向文档的链接,建议必须更改它的场景。(就像覆盖默认区域的情况一样)。另外,我更改它主要是因为它说@987654332 @ 通常与环境路径有关(我在我的项目中使用相同的变量)。提及它不是环境基础 url 而是特定于 aws 也可能很容易理解。但是再次是它的建议,不确定它是否最好的方法! :P
  • 是的,该链接适用于另一家公司的服务,该服务恰好与 S3 API 兼容。他们修改主机,因为他们希望 SDK 请求向他们的服务发送请求。在他们的用例中,他们记录的内容是正确的。
猜你喜欢
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多