2013-07-11 50 views
2

我一直在測試一些PHP腳本,它們使用aws-sdk-php將文件上傳到S3存儲。這些腳本似乎很好地工作時,他們直接從瀏覽器中執行,但未能試圖通過一個API類Luracast Restler使用它時3.0AWS PHP SDK 2(aws.phar)不支持Restler Framework

是上傳一些虛擬的文件就像下面的一個示例腳本:

<?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

要測試這個測試方法是寫得很好我已經創建了另一個PHP腳本/test/upload.php用下面的代碼:

<?php 

require_once (dirname(__FILE__) . '/../util/test.php'); 

test(); 

這樣我就可以在瀏覽器中輸入http://mydomain.com/test/upload.php和所有工作正常,文件在S3存儲上傳。

然而,當我打電話的功能測試()從與Restler框架的API類,我有說,AWS無法發現錯誤:

Fatal error: Class 'Aws\Common\Aws' not found in /var/app/current/util/test.php on line 12 

然而代碼是完全一樣的,完美從upload.php調用時起作用。我一直在浪費時間來弄清楚這裏發生了什麼,但我無法得出任何結論。就像aws-php-sdk自動加載器在某些情況下無法正常工作。

任何提示?

回答

0

此舉行我回相當長的一段時間,

的問題是由reslters自動加載造成此處描述這臺spl_autoload_unregiste : https://github.com/Luracast/Restler/issues/72

一種方式來獲得角落找尋問題是註釋掉相關供應商/ Luracast/Restler/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; 
}