2012-02-05 17 views
5

मैं अपने नियंत्रक में गतिशील रूप से ग्राफिक उत्पन्न:Symfony - जवाब में छवि - गति, अनुकूलन

  1. अगर फाइल नहीं मौजूद है (अद्वितीय फ़ाइल नाम) तो ग्राफिक पैदा करते हैं और यह

  2. वापसी RedirectResponse बचाने ($ यूआरएल)

(3. मैं भी कोशिश की है:

$fp = fopen($url, "rb"); 
    $str = stream_get_contents($fp); 
    fclose($fp); 

    $response = new Response($str, 200); 
    $response->headers->set('Content-Type', 'image/png'); 
    return $response; 

)

मैं यह गतिशील उत्पन्न करने के लिए की जरूरत है userbars उपयोगकर्ताओं [इस ग्राफिक पर कुछ पाठ स्वचालित रूप से अपडेट हो जाएगा कुछ परिवर्तन मेरी वेबसाइटों पर किया जाएगा यदि] के लिए।

तो यह मेरे लिए महत्वपूर्ण है कि इस स्क्रिप्ट तेजी से काम करता है और अपने सर्वर/bandwitch को मारने नहीं है। यह प्राप्त करने के लिए कि मैंने कैश बनाया है जहां सभी जेनरेट किए गए ग्राफिक्स संग्रहीत किए जाते हैं। लेकिन मुझे गति के साथ समस्या है, समाधान जो मैंने ऊपर वर्णित किया है, काफी धीमी है, जब मैंने डेवलपर टूल (एफ 12) के साथ क्रोम में इसका परीक्षण किया है तो यह मुझे दिखाता है कि दोनों समाधान (2. और 3.) लेते हैं लगभग ~ 1s (जब एक ही ग्राफिक्स [नियंत्रकों के बिना इत्यादि। सीधे यूआरएल को .png] 44ms लोड करता है)।

तो अगर मेरे लिए केवल इसके बारे में ~ 1s ग्राफिक प्रति तो लेता है, तो उदाहरण के लिए 1000 उपयोगकर्ता एक ही समय में इस ग्राफिक यह धीमी मेरी वेबसाइट मुझे लगता है कि कर सकते हैं उत्पन्न होगा।

कृपया मदद, आप किसी भी तेजी से तरीके कि ऐसा करने के लिए जानते हो?

पीएस। रीडायरेक्ट मेरे लिए सबसे ज्यादा इच्छा नहीं है, क्योंकि मैं यूआरएल को छोड़ना पसंद करूंगा, उदाहरण के लिए smth/username/userbar/smth/img/userbars/cache/blabla.png के insted। लेकिन अगर यह बहुत तेज होगा तो मैं इसे खड़ा कर सकता हूं :)।

संपादित करें: स्पष्ट है: मैं कैश छवियों का हल के लिए नहीं देख रहा हूँ, मेरी समस्या यह है कि नियंत्रक (पहले से उत्पन्न छवियों, बस एफ़टीपी से) के माध्यम से छवियों लौटने 1s के बारे में लेता है, जब आप उदाहरण

लिए क्या सामान्य रूप से करता है, तो
  <img src="direct_url_to_png"> 

यह 44ms के बारे में लेता है।

उत्तर

3

आप Varnish का उपयोग कर सकते इमेज को कैश करने के लिए, वार्निश एक HTTP प्रॉक्सी कि वेबसर्वर के सामने बैठता है। यह कॉन्फ़िगर करने के लिए कुछ समय के & ज्ञान लेता है, लेकिन यह एक बहुत सॉफ्टवेयर का अच्छा टुकड़ा है।

वैकल्पिक रूप से, आप shared memory, memcache, या redis का उपयोग कर स्मृति में छवियों को कैश कर सकते हैं। यह शायद वार्निश से कम प्रभावशाली होगा, लेकिन यह फाइल सिस्टम IO को सहेज लेगा।

आप परीक्षण करना चाहिए जहां सबसे अधिक समय बिताया है, मैं उम्मीद यह फ़ाइल मैं/हे और PHP पार्स करने समय का एक संयोजन है, लेकिन जैसा कि हम डच में कहा, "मापने जानना है";)

यहाँ एक सरल है उदाहरण जो आपको लगता है कि कैसे करना है पर सामान्य विचार देना चाहिए:

<?php 
class MyClass 
{ 
    function __construct() 
    { 
    $this->timer = array(
     'start' => microtime(True); 
    ); 
    } 

    function myAction() 
    { 
    $this->timer['startaction'] = microtime(True); 

    $fp = fopen($url, "rb"); 
    $this->timer['startstream'] = microtime(True); 
    $str = stream_get_contents($fp); 
    fclose($fp); 
    $this->timer['endstream'] = microtime(True); 

    $response = new Response($str, 200); 
    $response->headers->set('Content-Type', 'image/png'); 

    $this->timer['endaction'] = microtime(True); 
    print_r($this->timer) 
    return $response; 
    } 
} 

एक और बात हो सकता है कि एक विकल्प HTML/CSS उपयोग करने के लिए ग्राफ़ दिखाने के लिए है। यह आपके ग्राफ के जैसा दिखने के आधार पर काम कर सकता है या नहीं भी हो सकता है लेकिन मैंने इसे पहले इस्तेमाल किया है और यह काफी अच्छा काम करता है।

+0

"ग्राफ दिखाने के लिए HTML/CSS का उपयोग करना है" आपका क्या मतलब है? मुझे यह नहीं दिखाई देता क्योंकि मुझे डेटाबेस से कुछ आंकड़े प्राप्त करने की आवश्यकता है, इसलिए मैं इसे नियंत्रक द्वारा पास करना पसंद करूंगा। मुझे लगता है कि एक समस्या इस छवि को वापस करने में है (stream_get_contents या पुनर्निर्देशन का उपयोग करके लगभग 800ms)। वैसे, शायद मैं पूरी तरह गलत हूं और मेरा समाधान इतना बुरा नहीं है? अगर यह केवल उपयोगकर्ता के लिए छवि लोड करने पर प्रभाव डालता है और यह सर्वर को धीमा नहीं करेगा, मुझे लगता है कि यह ऐसा हो सकता है? जैसा कि मैंने देखा है कि आप जेनरेट की गई छवियों को संग्रहीत करने पर ध्यान केंद्रित करते हैं, लेकिन वास्तविक छवि इस छवि को वापस करने में है :)। –

+0

इस बार मैंने ऊपर लिखा है कैश से छवियों को लोड करना है। नियंत्रक के माध्यम से ftp से पहले से जेनरेट की गई छवि लोड करें लगभग 1s लेता है और मैं इसे बेहतर बनाना चाहता हूं। –

+0

सलाह के लिए धन्यवाद, मैंने इसका परीक्षण किया है और आम तौर पर यह इतना बुरा नहीं है। जब मैंने ग्राफिक को अलग से उत्पन्न किया तो यह केवल 150ms लोड करता है (इससे कोई फर्क नहीं पड़ता कि रीडायरेक्ट या stream_get_contents द्वारा) तो यह इतना बुरा नहीं है कि मुझे लगता है। इसे लोड करने में लगभग 32ms लगते हैं, लेकिन मैं जांचता हूं कि फ़ाइल मौजूद है या नहीं, डेटाबेस से जानकारी प्राप्त करें और ग्राफिक प्राप्त करें, इसलिए यह अच्छा लगता है। –

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