2012-09-17 73 views
5

亞馬遜AWSSDKforPHP太慢亞馬遜AWSSDKforPHP太慢

您好,

我使用亞馬遜AWSSDKforPHP連接我與S3的Web應用程序。但是,這個過程存在問題,或者向服務提出要求使其過於緩慢。

例如,我有這樣的代碼:

// 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'); 
} 

假設$圖片是用戶圖片的數組,這將返回一個數組名爲$有(正如他的名字一樣)的URL THA圖片的URL憑證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()」的情況下,腳本需要至少40秒35個圖像!

我已經修改了我的腳本,使用cURL請求:

// 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,但你能不能在桶中要求的文件列表,並執行字符串匹配/腳本搜索自己嗎?在PHP腳本中,34字符串匹配測試不應該花費太長的時間。 – thatidiotguy

+0

我不明白你的迴應: - | – Yefb

+0

我無法更好地解釋它。詢問存儲桶中所有文件的列表。在腳本中自己搜索。完成。無需等待亞馬遜API。 – thatidiotguy

回答

1

爲什麼不改變,你是怎麼做的檢查。將圖像的位置/桶本地存儲在數據庫中,這樣您就不必擔心這個檢查了嗎?

這樣可以最大限度地減少您現在正在做的35個API調用的數量,但是這可能會隨着時間的推移而呈指數級增長,而且,你不僅每個圖像只進行一次調用,而且每個圖像只調用兩次。 s是非常低效的,並且依賴於您的網絡連接速度相當快。

移動位置數據,如果圖像存在或不在本地是在這方面的性能方面更好的選擇。此外,這項檢查只需要一次完成,但如果您提前存儲結果,它看起來就像反正一樣。

1

我認爲如果你想能夠從S3讀取目錄類型的信息,你最好使用類似s3fs的東西來將你的存儲桶掛載爲系統驅動器。 s3fs也可以使用本地緩存進行配置,以加快速度(如果您使用EC2,則緩存在快速臨時存儲上)。

這將允許您輕鬆地執行常規PHP目錄處理(DirectoryIterator等)。

如果這比您想要的更多,至少將文件名數據存儲在數據庫中,並希望文件位於正確的S3位置或以某種方式緩存本地API檢查的結果,以便不需要爲每個類似請求進行API調用。

+0

我找不到在哪裏,但我可以發誓s3fs的開發商說,不要在生產環境中使用它。我們的經驗至少表現出緩慢的表現(儘管試用了至少6個月)。 – Christopher

+0

是的,除非您爲文件使用本地緩存目錄,否則性能會很差。實際上,我們只是將它用作傳統服務器上的一項權宜之計,它依賴於通過許多應用程序服務器對一組通用可下載文件的類似訪問。我不會推薦這個架構(更喜歡更多的以數據庫爲中心的方法),但它可能是OP的中間步驟。 –

0

這很慢,因爲您在循環的每次迭代中調用if_object_exists(),向AWS發出網絡請求。

用戶「thatidiotguy」說:

我不知道的S3 API,但你能不能在桶中要求的文件列表,並執行字符串匹配/腳本搜索自己嗎?在PHP腳本中,34字符串匹配測試不應該花費太長的時間。

他是對的。

與其說if_object_exists()的,可以改爲調用get_object_list()一次 - 在腳本的開始 - 那麼你的用戶照片網址比較使用PHP的in_array()功能列表。

你應該可以看到大約是數不勝數%的加速。儘管如此,不要引用我的話。 ;)