我从这个页面开始安装。
是SDK的第3版。这里的基本用法
<?php
require 'vendor/autoload.php';
use Aws'CloudFront'CloudFrontClient;
$cdn = new CloudFrontClient(
['version' => 'latest',
'region' => 'us-east-1']
);
// Create a new invalidation.
$response = $cdn->create_invalidation('EPYAAAAAAPAA', 'aws-clear-cache' . time(), "/*");
根据本文
可捕获致命错误:参数2传递给Aws'AwsClient::getCommand()的类型必须是array, string given,在/Users/jason/www/aws/vendor/aws/aws-sdk-php/src/AwsClient.php上线167,定义为/Users/jason/www/aws/vendor/aws/aws-sdk-php/src/AwsClient.php上线211
更新,
$config = array(
'region' => 'us-east-1',
'version' => '2015-07-27',
'credentials' => array(
'key' => env('AMAZON_KEY_CLOUDFRONT'),
'secret' => env('AMAZON_SECRET_CLOUDFRONT')
)
);
$cdn = new CloudFrontClient($config);
$cache = array('DistributionId' => env('CLOUDFRONT'),
'InvalidationBatch' => array(
'CallerReference' => 'none',
'Paths' => array(
'Quantity' => 1,
'Items' => array( 'test' => '/*')
)
)
);
// Create a new invalidation.
$response = $cdn->createInvalidation($cache);
var_dump($response);
我看了一下这里发生了什么,显然你使用了无效的方法签名。
首先,AWS PHP SDK使用所谓的"服务描述模型"来获取您指定版本的API接口。在这种情况下,这意味着他们正在使用一些元编程技术来提供一个接口,看起来像普通的PHP函数调用,但这些函数并没有硬编码在SDK中。它们并不像我们通常认为的那样真正存在,至少不是常规的PHP函数。下面是一些PHP的魔法。
当你调用$cdn->create_invalidation()
时,它运行在从Aws'AwsClient
继承的Aws'CloudFront'CloudFrontClient
实例上。这两个类(以及它们的祖先类)实际上都没有::create_invalidation()
方法实现。但是AwsClient
确实实现了PHP的魔法方法::__call()
。你可以在PHP文档中看到这个神奇方法的完整信息,但基本上当你调用对象上不存在的任何方法时,如果它的类实现了::__call()
,那么::__call()
将被调用。
现在我们在::__call()
内部(你可以在这里看到代码),这个方法最终调用::getCommand()
。在::getCommand()
内部,您可以看到方法签名需要传入一个数组(第一个参数$name
是唯一的其他方法参数,由于上面实现::__call()
的方式,它的值将为"create_invalidation"
)。这就是第一个问题出现的地方:你需要传入一个数组,而不是单独的字符串或时间戳或其他任何东西。
但是还有一件事;您想要调用的实际方法不是create_invalidation
,而是createInvalidation
。这里有SDK的完整API文档——只要确保你选择了正确的版本。对于我正在寻找的版本,您可以在这里找到用于创建无效的API文档和方法签名。
你可以在项目的GitHub自述中找到很多关于AWS PHP SDK的信息,包括用户指南、API文档等的链接。祝你好运和快乐编码:)