2011-10-17 15 views
5

मैं ऐसे एप्लिकेशन पर काम कर रहा हूं जो अमेज़ॅन के एमडब्ल्यूएस एपीआई का उपयोग ज्यादातर PHP में लिखा गया है। यह एप्लिकेशन अमेज़ॅन विक्रेताओं को साइन अप करने की अनुमति देता है, कुछ अमेज़ॅन विक्रेता प्रमाण-पत्र प्रदान करता है और एप्लिकेशन अमेज़ॅन से इस उपयोगकर्ता के ऑर्डर को एक MySQL डेटाबेस में रखने के लिए शुरू होता है।PHP में एसिंक्रोनस फ़ंक्शन चलाने का सबसे प्रभावी तरीका क्या है?

मैंने एकाधिक कार्यों के साथ एक स्क्रिप्ट का उपयोग कर डेटा को सटीक रूप से डेटा सिंक करने के तरीकों का निर्माण किया है, लेकिन ध्यान दिया कि यह बहुत लंबा रास्ता लेता है। यह स्क्रिप्ट डेटाबेस में सभी उपयोगकर्ताओं के माध्यम से बस लूप करती है और एक ही समय में सभी ऑर्डर को पुन: सक्रिय करती है। अभी, केवल 5 परीक्षण उपयोगकर्ताओं के साथ, समय करने योग्य है लेकिन मैं एक और अधिक विस्तार योग्य विधि की तलाश में हूं। 500 उपयोगकर्ताओं को एक समय में सिंक्रनाइज़ रूप से चल रहे सभी के बारे में सोचें। बहुत लंबा रास्ता!

मैं PHP के लिए काफी नया हूं और विशेष रूप से इससे असीमित प्रक्रियाएं चला रहा हूं। एकमात्र तरीका मैंने पाया है कि मैं ऐसा कर सकता हूं एक स्टार्टर स्क्रिप्ट है जो डेटाबेस में सभी उपयोगकर्ताओं को पाती है और प्रत्येक उपयोगकर्ता के लिए एक सिंक स्क्रिप्ट स्पॉन्स करती है, फिर इसे रिलीज़ करती है। मुझे यह विचार पसंद नहीं है क्योंकि अगर मेरे पास 500+ उपयोगकर्ता थे, तो मेरी रात की सिंक में इस PHP स्क्रिप्ट के 500 स्पॉन्ड उदाहरण होंगे।

क्या किसी ने इससे पहले ऐसा कुछ किया है? यदि ऐसा है, तो मुझे यह जानना अच्छा लगेगा कि इस सिंक को और अधिक कुशल बनाने के लिए सबसे अच्छा तरीका है।

उत्तर

1

सहमत w/DaveRandom, बाहर HTTP अनुरोध पूल कार्यान्वयन के लिए, जाँच नहीं बल्कि अपनी खुद की http://www.php.net/manual/en/class.httprequestpool.php

+0

मैंने कभी भी HTTPRequestPool क्लास के बारे में नहीं सुना है। धन्यवाद!हालांकि, इससे मैं यह समझ सकता हूं कि इसे एसिंक्रोनस HTTP अनुरोध भेजने के लिए कैसे प्राप्त किया जाए, लेकिन मुझे प्रत्येक परिणाम को संसाधित करने की भी आवश्यकता है जिसे मैं अलग से प्राप्त करता हूं। क्या यह किया जा सकता है? –

+0

मुझे विश्वास है। क्या आपने डॉक्स पढ़ा है? विशेष रूप से "getFinishedRequests" विधि देखें - http://www.php.net/manual/en/function.httprequestpool-getfinishedrequests.php – rICh

2

के बाद से पीएचपी नहीं किया जा सकता मल्टी-थ्रेडेड , व्यवहार में आप केवल 2 विकल्प हैं (वहाँ यह करने के लिए कई तरीके हैं, लेकिन वे सभी श्रेणियों के लिए निम्न करने के लिए नीचे फोड़ा):

  • है प्रति उपयोगकर्ता ऑपरेशन 1 प्रक्रिया। जैसा कि आप कहते हैं, एक बड़े डेटाबेस के साथ, इससे कई प्रक्रियाएं हो सकती हैं।
  • एक ऐसी प्रक्रिया है जो एक से अधिक उपयोगकर्ता से संबंधित है। यह संभावित रूप से अधिक समय लेगा, क्योंकि प्रत्येक प्रक्रिया प्रभावी ढंग से तुल्यकालिक है।

मुझे लगता है कि सबसे अच्छा शर्त दो दृष्टिकोणों को जोड़ना है, इसलिए आपके पास कई प्रक्रियाएं हैं जो एकाधिक उपयोगकर्ताओं से निपटती हैं। तो यदि आपके पास 500 उपयोगकर्ता थे, तो 100 प्रक्रियाएं उत्पन्न होती हैं जो प्रत्येक 5 उपयोगकर्ताओं के साथ सौदा करती हैं, या 50 प्रक्रियाएं जो 10 उपयोगकर्ताओं के साथ सौदा करती हैं।

वैकल्पिक रूप से, यह उस भाषा में एक प्रोग्राम लिखने लायक हो सकता है जो कार्य के लिए बेहतर अनुकूल है - कुछ जो जावा या पर्ल जैसे बहु-थ्रेडिंग का समर्थन करता है - यदि आप आवश्यक हो तो PHP से शुरू कर सकते हैं।

संपादित 03/2013: पीएचपी अब थ्रेड जा सकता है लेकिन इसके उत्पादन प्रयोग के लिए सिफारिश नहीं के रूप में pthreads एक्सटेंशन अभी भी अत्यधिक अस्थिर है, और यह भी औसत उपयोगकर्ता के लिए अनुशंसित नहीं है, सिर्फ तभी जब इस का उपयोग क्या तुम सच में पता है कि तुम क्या कर रहे हैं

+0

उत्तर के लिए धन्यवाद। मैं इसे PHP में रखना पसंद करूंगा क्योंकि संपूर्ण ऐप PHP में लिखा गया है, हालांकि, वास्तव में, यह एक बेहतर समाधान हो सकता है। यह PHP का एक बड़ा दोष है। :( –

+0

ब्याज से, आप बच्चे की प्रक्रियाओं को कैसे बढ़ा रहे हैं? 'Pcntl_fork()', 'exec ('php script.php>/dev/null &');' या किसी अन्य विधि के साथ जिसे मैं अभी नहीं सोच सकता ? – DaveRandom

+0

मैं अभी तक एक निश्चित समाधान के साथ नहीं आया था। हालांकि, मेरा विचार निष्पादन फ़ंक्शन का उपयोग करना था। –

0

मैं passthru का उपयोग कर और पृष्ठभूमि के लिए स्क्रिप्ट गुजर समाप्त रोलिंग से। प्रतीत होता है कि चीजें अब तक अच्छी तरह से काम कर रही हैं।