2010-09-21 9 views
5

भी देखें Having a PHP script loop forever doing computing jobs from a queue system, लेकिन यह मेरे सभी सवालों का जवाब नहीं देता है।एक PHP स्क्रिप्ट हमेशा के लिए चलाएं, एक कतार

अगर मैं एक PHP स्क्रिप्ट हमेशा के लिए चलाना चाहते हैं, एक कतार पहुँचने और नौकरियों कर रही:

  1. स्मृति समस्याओं के लिए क्षमता क्या है? उनसे कैसे बचें? (किसी भी फ्लश फ़ंक्शन या मुझे कुछ उपयोग करना चाहिए?)

  2. यदि किसी कारण से स्क्रिप्ट मर जाती है तो क्या होगा? स्वचालित रूप से इसे फिर से शुरू करने के लिए एक अच्छी विधि क्या होगी?

  3. स्क्रिप्ट शुरू करने के लिए सबसे अच्छा बुनियादी दृष्टिकोण क्या होगा। चूंकि यह हमेशा के लिए चलता है, मुझे क्रॉन की आवश्यकता नहीं है। लेकिन मैं इसे कैसे शुरू करूं? (यह भी देखें 2.)

+0

1. आप जो कर रहे हैं उस पर निर्भर करता है। कुछ एक्सटेंशन में कुछ गंभीर मेम लीक होते हैं। - 2. कुछ प्रकार के वॉचगार्ड का प्रयोग करें। - 3. इसे पृष्ठभूमि में कांटा()। – halfdan

+0

यह हमेशा के लिए क्या करने में व्यस्त होने जा रहा है? यह हमेशा * काम करने जा रहा है? जब यह कतार को हटा देता है, तब यह क्या करता है? और क्यों PHP? – Dolph

उत्तर

9

क्रेन स्क्रिप्ट के रूप में कतार सेट करें। इसे हर 10 सेकंड में निष्पादित करें। जब स्क्रिप्ट फिसल जाती है, तो जांचें कि क्या लॉक फ़ाइल मौजूद है (कुछ .lock जैसे)। यदि वहाँ है, तुरंत बाहर निकलें। यदि नहीं, तो .lock बनाएं और प्रसंस्करण शुरू करें। यदि कोई त्रुटि उत्पन्न होती है, तो इन त्रुटियों को ईमेल/लॉग करें, हटाएं और निकालें। यदि कोई कार्य नहीं है, तो बाहर निकलें।

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

+0

बहुत अच्छा लगता है, शायद मुझे इस तरह से अपने डिमन को फिर से लिखना चाहिए। खुश होती है। –

+0

+1 मैं इस दृष्टिकोण का उपयोग करता हूं। यह सरल और प्रभावी है। – goat

0

राज्य मशीनों के साथ बहुत दूर नहीं जा रहा है, कम से कम राज्यों को 'नौकरियों' (उदाहरण: flv2avi रूपांतरण) और 'कार्यों' (flv2avi 1.flv) दोनों को पेश करना एक अच्छा विचार है।

मेरी स्क्रिप्ट (पर्ल) पर, कभी-कभी ज़ोंबी प्रक्रियाएं पूरी स्क्रिप्ट के प्रदर्शन को डाउनग्रेड करना शुरू कर रही हैं। यह एक दुर्लभ मामला है, लेकिन यह स्रोत में मूल है, इसलिए स्क्रिप्ट अब कतार पढ़ने को रोकने में सक्षम होना चाहिए, जिससे नए उदाहरण अपने कार्यों को जारी रखने की अनुमति दे सकते हैं &jobs; हालांकि, चल रहे कार्यों के डेटा को अधिक से अधिक ध्यान में रखते हुए। एक बार पहले उदाहरण में 1-2 कार्य होते हैं, यह मारे जाते हैं।

शुरुआत में: आम त्रुटियों (बंद होने के कारण) ज्ञात त्रुटियों के लिए जांच करने के लिए जांच मार जो भी मार डाला और 'इंतज़ार कर' के लिए स्थिति सेट किया जा सकता है (स्थान से बाहर, इनपुट नहीं पढ़ सकते हैं) सभी इंतजार कर शुरू ।

यदि आप एक पाइप वाली नौकरियां चलाते हैं (vlc | ffmpeg, tail -f | grep), तो आप अपने प्रोग्राम में बहुत अधिक I/O का उपयोग करने से बचने की कोशिश कर सकते हैं, बजाय फोर्क() (PHP के लिए बुरा विचार?) या बस कॉलिंग/bin/bash -c "prog1 | prog2", यह बहुत सीपीयू लोड बचाता है।

प्रारंभ अंक: दोनों /etc/rc.d और क्रॉन (प्रक्रियाओं की जांच, पहले उदाहरण चलाने || 'डिबग' तर्क के साथ दूसरे चलाने)

1

पीएचपी का उपयोग करते समय कर सकते हैं (प्रकाशित करें और उपभोग) MQ के, पर अगर ऐसा करने के लिए एक पूरी तरह से कार्यात्मक एमक्यू आवेदन का उपयोग करने के लिए सभी संभव प्रयास करें।

एक पूरी तरह से कार्यात्मक एमक्यू आवेदन (रूबी, पर्ल, .NET, जावा आदि में) सभी समवर्ती, त्रुटि लॉगिंग, राज्य प्रबंधन और स्केलेबिलिटी मुद्दों पर चर्चा करेगा जो आप चर्चा करते हैं।

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