2009-04-04 17 views
8

से भारी प्रसंस्करण (जैसे छवि आकार बदलने) को ऑफ़लोड करने का सबसे अच्छा तरीका मैं एक PHP वेब इंटरफेस पर काम कर रहा हूं जो भारी ट्रैफिक प्राप्त करेगा। कुछ सम्मिलित/अद्यतन अनुरोधों में ऐसी छवियां होंगी जिन्हें उनके सामान्य पुनर्प्राप्ति को गति देने के लिए कुछ सामान्य आकारों में आकार बदलना होगा।PHP अनुरोध

ऐसा करने का एक तरीका शायद सर्वर पर कुछ एसिंक्रोनस कतार स्थापित करना है। उदाहरण के लिए। एक कार्य कतार के साथ एक डीबी में एक टेबल स्थापित करें जो PHP अनुरोधों द्वारा पॉप्युलेट किया जाएगा और सर्वर पर कुछ अन्य प्रक्रिया तालिका को देखने और किसी प्रतीक्षा कार्य को संसाधित करने दें। आप वह कैसे करेंगें? उस लंबी चल रही प्रक्रिया के लिए उचित वातावरण क्या होगा? जावा, या शायद कुछ हल्का होगा?

उत्तर

14

यदि आप जो कर रहे हैं वह वास्तव में उच्च मात्रा है तो आप जो खोज रहे हैं वह beanstalkd जैसा कुछ है। यह एक वितरित काम कतार प्रोसेसर है। आप बस कतार पर नौकरी डालते हैं और फिर इसके बारे में भूल जाते हैं।

बेशक आपको दूसरी छोर पर कतार पढ़ने और काम को संसाधित करने की आवश्यकता है। ऐसा करने के कई तरीके हैं।

सबसे कठिन संभवतः एक क्रॉन नौकरी है जो काम कतार को पढ़ने और अनुरोधों को संसाधित करने के लिए पर्याप्त रूप से अक्सर चलती है। वैकल्पिक रूप से आप किसी प्रकार की लगातार डेमॉन प्रक्रिया का उपयोग कर सकते हैं जो काम उपलब्ध होने से जागृत हो जाता है।

इस तरह के दृष्टिकोण का लाभ यह है कि आप श्रमिकों की संख्या को तैयार कर सकते हैं कि कितना काम करने की आवश्यकता है और बीनस्टॉकड हैंडल वितरित prorcessing (इस अर्थ में कि श्रोता विभिन्न मशीनों पर हो सकते हैं)।

+1

मैंने हाल ही में एक बीनस्टॉकड/PHP कतार प्रोसेसर लागू किया है, और इसके एक हिस्से के रूप में, एक छवि रेजिज़र। बाद में 2 सप्ताह और 9 50 के नौकरियां (3600+ आकार के साथ), आमतौर पर पृष्ठ को वापस करने के लिए कम समय में आकार बदलने का पूरा होता है। –

2

आप एक क्रॉन कार्य सेट कर सकते हैं जो कतार तालिका की जांच करेगा। कतार में प्रतीक्षा करने वाली कार्रवाइयों को संभालने वाली स्क्रिप्ट लिखी जा सकती है उदा। PHP में इसलिए आपको कार्यान्वयन भाषा को बदलने की आवश्यकता नहीं है।

2

आप एक डेमॉन बनाना चाहते हैं जो समय के लिए "सो" होगा और फिर प्रक्रियाओं के लिए डेटाबेस की जांच करेगा। एक बार जब यह प्रक्रिया करने के लिए आइटम मिल जाए, तो यह उन्हें संसाधित करेगा और फिर जितनी जल्दी हो सके, फिर से जांचें, अगर नहीं, तो सो जाओ। आप PHP सहित किसी भी भाषा में डिमन बना सकते हैं।

वैकल्पिक रूप से, आप केवल एक स्क्रिप्ट निष्पादित कर सकते हैं और जारी रख सकते हैं। ताकि PHP जारी रखने से पहले स्क्रिप्ट समाप्त होने की प्रतीक्षा न करे, पृष्ठभूमि में इसे निष्पादित करें।

exec("nohup /usr/bin/php -f /path/to/script/script.php > /dev/null 2>&1 &"); 

यद्यपि आप जब से तुम होने भी कई प्रक्रियाओं पृष्ठभूमि में चल रहा से कोई कतार है खत्म हो सकता है कि के साथ सावधान रहना होगा।

2

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

+0

+1 बीनस्टॉक मैं एक PHP वेबसाइट और बीनस्टॉक क्लाइंट के साथ ऐसा कर रहा हूं। 1.6 एम नौकरियों ने अब तक किए गए कार्यों के पहले सेट के लिए (14 दिनों में) सेवा की है। –

+1

क्या कोई बीनस्टॉक क्लाइंट है, जो आरक्षित नहीं हो सकता है? – Fluffy

1

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

यहाँ कैसे छवि प्रसंस्करण परिवर्तनों का एक समूह ऐसा करने के लिए पर एक लेख है:

http://dev.iron.io/solutions/image-processing/

उदाहरण रूबी में देखते हैं, लेकिन आप बहुत आसानी से पीएचपी के साथ एक ही सामान कर सकता है।

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