我一直在测试一些使用aws-sdk-PHP将文件上传到S3存储的PHP脚本。当这些脚本直接从浏览器执行时,它们似乎工作得很好,但当试图通过LuracastRestler3.0中的API类使用时失败
上传一些伪文件的示例脚本如下所示:
<?php
require_once (dirname(__FILE__) . "/../lib/aws/aws.phar");
use Aws'Common'Aws;
use Aws'S3'Enum'CannedAcl;
use Aws'S3'Exception'S3Exception;
use Aws'Common'Enum'Region;
function test(){
// Instantiate an S3 client
$s3 = Aws::factory(array(
'key' => 'key',
'secret' => 'secret',
'region' => Region::EU_WEST_1
))->get('s3');
try {
$s3->putObject(array(
'Bucket' => 'my-bucket',
'Key' => '/test/test.txt',
'Body' => 'example file uploaded from php!',
'ACL' => CannedAcl::PUBLIC_READ
));
} catch (S3Exception $e) {
echo "There was an error uploading the file.'n";
}
}
此脚本位于文件夹/util/test.php中,而aws-php-sdk位于/lib/aws/aws.phar中
为了测试这个测试方法是否写得很好,我在/test/upload.php上创建了另一个php脚本,代码如下:
<?php
require_once (dirname(__FILE__) . '/../util/test.php');
test();
这样我就可以在浏览器中输入http://mydomain.com/test/upload.php并且一切都如预期的那样工作,并且文件被上传到S3存储器中。
然而,当我用Restler框架从API类调用函数test()时,我有一个错误,说找不到Aws:
Fatal error: Class 'Aws'Common'Aws' not found in /var/app/current/util/test.php on line 12
然而,当从upload.php调用时,代码完全相同。我一直在浪费几个小时试图弄清楚这里发生了什么,但我无法得出任何结论。就像aws-php-sdk自动加载器在某些情况下不能很好地工作一样。
有什么提示吗?
这让我耽误了很长一段时间,
该问题是由设置spl_autoload_unregiste的reslters autoloader引起的如下所述:https://github.com/Luracast/Restler/issues/72
解决问题的一种方法是在vendor/Luracast/Resler/AutoLoader.php 中注释掉相关行
public static function thereCanBeOnlyOne() {
if (static::$perfectLoaders === spl_autoload_functions())
return static::$instance;
/*
if (false !== $loaders = spl_autoload_functions())
if (0 < $count = count($loaders))
for ($i = 0, static::$rogueLoaders += $loaders;
$i < $count && false != ($loader = $loaders[$i]);
$i++)
if ($loader !== static::$perfectLoaders[0])
spl_autoload_unregister($loader);
*/
return static::$instance;
}