2012-09-17 19 views
5

アマゾンAWSSDKforPHP遅すぎるアマゾンAWSSDKforPHPが遅すぎる

こんにちは、

。しかし、これを遅くするようなサービスへのリクエストやプロセスの問題があります。

$画像は、ユーザーの写真の配列であり、これは、配列が(彼の名前が言うように)持っている$ URLを呼ば股関節画像のURLを返すと仮定すると
// Iterate an array of user images 
foreach($images as $image){ 
    // Return the Bucket URL for this image 
    $urls[] = $s3->get_object_url($bucket, 'users/'.trim($image).'.jpg', '5 minutes'); 
} 

例えば、私はこのコードを持っています資格情報を5分間入力します。このリクエストは35枚の画像で少なくとも6秒かかります。これは問題ありません。しかし....画像がバケツに存在しない場合、私はユーザーのためのデフォルトの画像を割り当てたいと思っています。これは 'images/noimage.png'のようなものです。 は、ここでは、コードです:

// Iterate an array of user images 
foreach($images as $image){ 

    // Check if the object exists in the Bucket 
    if($s3->if_object_exists($bucket, 'users/'.trim($image).'.jpg')){ 
     // Return the Bucket URL for this image 
     $urls[] = $s3->get_object_url($bucket, 'users/'.trim($image).'.jpg', '5 minutes'); 
    } else { 

     // Return the default image 
     $urls[] = 'http://www.example.com/images/noimage.png'; 
    } 

} 

そして条件は動作しますが、SLOOOOOW。 "$ s3-> if_object_exists()"という条件では、スクリプトは35枚の画像で少なくとも40秒かかります!

私はカールを使用して要求すること、私のスクリプトを変更した:

// Iterate an array of user images 
foreach($images as $image){ 

    // Setup cURL 
    $ch = curl_init($s3->get_object_url($bucket, 'users/'.trim($image).'.jpg', '1 minutes')); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $response = curl_exec($ch); 
    // Get Just the HTTP response code 
    $res = curl_getinfo($ch,CURLINFO_HTTP_CODE); 

    if($res == 200){ //the image exists 
     $urls[] = $s3->get_object_url($bucket, 'users/'.trim($image).'.jpg', '5 minutes'); 
    }else{ // The response is 403 
     $urls[] = 'http://www.example.com/images/noimage.png'; 
    } 
} 

をそして、この修正されたスクリプトは、16〜18秒かかります。これは大きな違いですが、それはまだ時間:(多くのです。

してください、任意のヘルプはそんなに高く評価されています。

ありがとう。

+3

私はS3 APIについて知りませんが、バケット内のファイルのリストを尋ねることができますし、文字列に一致する/スクリプト内で自分自身を検索しますか? 34文字の文字列一致テストは、PHPスクリプト内で長時間実行する方法はありません。 – thatidiotguy

+0

私はあなたの応答を理解していない: - | – Yefb

+0

それ以上は説明できません。バケット内のすべてのファイルのリストを要求します。自分のスクリプトで自分で検索してください。完了しました。アマゾンAPIを待つ必要はありません。 – thatidiotguy

答えて

1

なぜあなたはあなたのチェックを行っている方法を変更しません。

このようにして、現在行っているAPI呼び出しの数を最小限に抑えることができますが、今の場合は35ですが、画像の位置/バケットをローカルにデータベースに保存してください。これは時間とともに指数関数的に大きくなる可能性があります。また、画像ごとに1つの呼び出しを行うだけでなく、大部分は画像ごとに2つの呼び出しを行います。非常に非効率的であり、ネットワーク接続にはかなり高速です。

位置データを移動し、画像が存在するかどうかをローカルに確認すると、この領域のパフォーマンスがはるかに良い選択になります。また、このチェックは、結果をあらかじめ保存しておくと、一度だけ実行する必要があります。

1

私は、S3からディレクトリタイプの情報を読み取れるようにするには、バケットをシステムドライブとしてマウントするためにs3fsのようなものを使用するのが最善だろうと思います。また、s3fsをローカルキャッシュで設定して処理を高速化することもできます(EC2を使用している場合は、高速一時記憶域にキャッシュする)。

これにより、通常のPHPディレクトリ処理(DirectoryIteratorなど)を簡単に行うことができます。

これ以上混乱したくない場合は、少なくともファイル名のデータをデータベースに保存し、ファイルが適切なS3の場所にあることを期待するか、個々のAPIチェックの結果をローカルにキャッシュする同様のリクエストごとにAPI呼び出しを行う必要はありません。

+0

私はどこに見つけることができませんが、私はs3fsの開発者が運用環境でそれを使用しないと言いました。私たちの経験は、少なくともパフォーマンスは低かった(試してから少なくとも6ヶ月経っている)。 – Christopher

+0

はい、ファイルのローカルキャッシュディレクトリを使用しない限り、パフォーマンスが低下します。実際には、これを、多くのアプリケーションサーバーを経由してダウンロード可能なファイルの共通セットに同様のアクセスを使用しているレガシーサーバー上の一時的な対策としてのみ使用しました。私はこのアーキテクチャーをまったく推奨しませんが(より多くのデータベース中心のアプローチが好まれますが)、おそらくOPの中間ステップになる可能性があります。 –

0

ループを経由するたびにif_object_exists()に電話をかけているため、AWSへのネットワークリクエストを開始するため時間がかかります。

ユーザー「thatidiotguyは、」言った:

私はS3のAPIについては知らないが、スクリプトの中で自分自身を検索/バケット内のファイルのリストを求めると、文字列のマッチングを行うことができますか? 34文字の文字列一致テストは、PHPスクリプト内で長時間実行する方法はありません。

彼はそうです。

代わりif_object_exists()を呼び出すので、あなたの代わりに一度get_object_list()を呼び出すことができます - スクリプトの先頭に - その後、PHPのin_array()機能を使用して、リストに自分のユーザーの写真のURLを比較します。

スピードアップが約1%になるはずです。しかし、それについて私を引用しないでください。 ;)

関連する問題