2

aws-sdk-php を使用して S3 ストレージにファイルをアップロードするいくつかの PHP スクリプトをテストしています。これらのスクリプトは、ブラウザーから直接実行するとうまく動作するように見えますが、Luracast Restler 3.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 オートローダが状況によってはうまく動作しないようなものです。

ヒントはありますか?

4

1 に答える 1

0

これは私をかなりの時間妨げました、

この問題は、 https ://github.com/Luracast/Restler/issues/72 で説明されているように spl_autoload_unregiste を設定する reslters オートローダーが原因で発生し ます。

この問題を回避する 1 つの方法は、 vendor/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;
}
于 2014-02-20T21:49:52.560 に答える