2012-09-17 25 views
5

अमेज़न AWSSDKforPHP बहुत धीमी गति सेअमेज़न AWSSDKforPHP बहुत धीमी गति से

नमस्ते,

मैं S3 के साथ अपने वेब अनुप्रयोग को जोड़ने के लिए अमेज़न AWSSDKforPHP उपयोग कर रहा हूँ। लेकिन, प्रक्रिया के साथ कोई समस्या है या सेवा के लिए अनुरोध कर रहा है जो इसे बहुत धीमा कर देता है।

उदाहरण के लिए, मैं इस कोड है:

// 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 भी कहा जाता रिटर्न 5 मिनट के लिए प्रमाण पत्र के साथ। इस अनुरोध में 35 छवियों के साथ कम से कम 6 सेकंड लगते हैं, और यह ठीक है। लेकिन .... जब चित्र बाल्टी में मौजूद नहीं है, तो मैं उपयोगकर्ता के लिए एक डिफ़ॉल्ट छवि असाइन करना चाहता हूं, जैसे 'छवियों/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 सेकंड लगते हैं!

मैं अपने स्क्रिप्ट में बदलाव कर दिया, अनुरोध 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

मुझे एस 3 एपीआई के बारे में पता नहीं है, लेकिन क्या आप बाल्टी में फाइलों की एक सूची मांग सकते हैं और स्ट्रिंग मिलान/स्क्रिप्ट में स्वयं को खोज सकते हैं? PHP स्ट्रिप में लंबे समय तक 34 स्ट्रिंग मिलान परीक्षणों को कहीं भी नहीं लेना चाहिए। – thatidiotguy

+0

मुझे आपकी प्रतिक्रिया नहीं समझा: - | – Yefb

+0

मैं इसे किसी भी बेहतर समझा नहीं सकता। बाल्टी में सभी फाइलों की एक सूची के लिए पूछें। अपनी स्क्रिप्ट में स्वयं के माध्यम से खोजें। किया हुआ। अमेज़ॅन एपीआई पर इंतजार करने की कोई ज़रूरत नहीं है। – thatidiotguy

उत्तर

1

कैसे आप अपने चेक कर रहे हैं क्यों नहीं बदल। डेटाबेस में स्थानीय रूप से छवियों के स्थान/बाल्टी को स्थानीय रूप से स्टोर करें, इस तरह आपको इस चेक के बारे में चिंता करने की ज़रूरत नहीं है?

इस तरह आप एपीआई कॉल की संख्या को कम कर सकते हैं जो आप कर रहे हैं जो अब आपके मामले में 35 है, लेकिन यह समय के साथ तेजी से बड़ा हो सकता है। और, न केवल आप प्रति छवि एक कॉल कर रहे हैं बल्कि अधिकांश भाग के लिए प्रति छवि दो कॉल। Thi एस आपके नेटवर्क कनेक्शन पर काफी तेज़ और निर्भर है जो काफी तेजी से है।

स्थान डेटा को स्थानांतरित करना और यदि छवि मौजूद है या स्थानीय रूप से नहीं है तो इस क्षेत्र में प्रदर्शन के संदर्भ में एक बेहतर विकल्प है। इसके अलावा, यदि आप समय से पहले परिणाम संग्रहीत करते हैं तो यह जांच केवल एक ही समय में की जानी चाहिए।

1

मुझे लगता है कि यदि आप S3 से निर्देशिका प्रकार की जानकारी को पढ़ने में सक्षम होना चाहते हैं, तो आप सिस्टम बाल्टी के रूप में अपनी बाल्टी को माउंट करने के लिए s3fs जैसे कुछ का उपयोग कर सकते हैं। एस 3 एफ को चीजों को गति देने के लिए स्थानीय कैश के साथ भी कॉन्फ़िगर किया जा सकता है (यदि आप ईसी 2 का उपयोग कर रहे हैं तो तेजी से क्षणिक भंडारण पर कैश)।

यह आपको आसानी से नियमित PHP निर्देशिका हैंडलिंग (DirectoryIterator, आदि) करने की अनुमति देगा।

यदि यह आपके साथ गड़बड़ करना चाहते हैं, तो कम से कम डेटाबेस में फ़ाइल नाम डेटा स्टोर करें और बस फ़ाइलों को उचित S3 स्थानों में रहने की उम्मीद करें या अलग-अलग एपीआई जांच के परिणामों को स्थानीय तरीके से कैश करें ताकि प्रत्येक समान अनुरोध के लिए एपीआई कॉल करने की आवश्यकता नहीं है।

+0

मुझे कहां नहीं मिल सका, लेकिन मैं एस 3 एफ के डेवलपर्स की शपथ ले सकता था कि उत्पादन उत्पादन में इसका इस्तेमाल न करें। इसके साथ हमारे अनुभव, कम से कम, धीमी प्रदर्शन का प्रदर्शन किया (हालांकि यह कोशिश करने के बाद से कम से कम छह महीने हो गया है)। – Christopher

+0

हां यह धीमा प्रदर्शन होगा जब तक आप फ़ाइलों के लिए स्थानीय कैश निर्देशिका का उपयोग नहीं करते। हमने वास्तव में केवल एक विरासत सर्वर पर एक स्टॉपगैप उपाय के रूप में इसका उपयोग किया जो कि कई अनुप्रयोग सर्वरों के माध्यम से डाउनलोड करने योग्य फ़ाइलों के एक सामान्य सेट के समान पहुंच पर निर्भर था। मैं इस आर्किटेक्चर को बिल्कुल भी अनुशंसा नहीं करता (अधिक डेटाबेस-केंद्रित दृष्टिकोण पसंद करते हैं), लेकिन यह संभवतः ओपी के लिए एक मध्यवर्ती कदम हो सकता है। –

0

यह धीमा है क्योंकि आप लूप के माध्यम से प्रत्येक पुनरावृत्ति में if_object_exists() पर कॉल कर रहे हैं, एडब्ल्यूएस के लिए नेटवर्क अनुरोध को लात मार रहे हैं।

उपयोगकर्ता "thatidiotguy" ने कहा:

मैं S3 एपीआई के बारे में पता नहीं है, लेकिन आप अपने आप को स्क्रिप्ट में खोज बाल्टी में फ़ाइलों की एक सूची के लिए पूछ सकते हैं और स्ट्रिंग मिलान कर सकता है /? PHP स्ट्रिप में लंबे समय तक 34 स्ट्रिंग मिलान परीक्षणों को कहीं भी नहीं लेना चाहिए।

वह सही है।

इसके बजाय if_object_exists() बुलाने की, आप के बजाय get_object_list() एक बार कॉल कर सकते हैं - स्क्रिप्ट की शुरुआत में - तो PHP के in_array() फंक्शन का उपयोग करके सूची में अपना उपयोगकर्ता तस्वीर यूआरएल की तुलना करें।

आपको लगभग एक अरब प्रतिशत की गति देखना चाहिए। हालांकि, मुझे उस पर उद्धरण मत दो। ;)

संबंधित मुद्दे