2010-11-02 10 views
8

मेरे पास एक क्रॉन जॉब के रूप में एक php स्क्रिप्ट चलाया जाता है जो डेटाबेस में प्रत्येक उपयोगकर्ता के लिए लूप को सरल कार्यों का एक सेट निष्पादित करता है और इसे पूरा करने में लगभग 30 मिनट लगते हैं। यह प्रक्रिया हर घंटे शुरू होती है और जितनी जल्दी हो सके उतनी तेज और कुशल होने की आवश्यकता होती है। समस्या आई है, किसी भी सर्वर स्क्रिप्ट के साथ है, निष्पादन समय बदलता है और मुझे सबसे अच्छा क्रॉन समय सेटिंग्स पता लगाने की जरूरत है।PHP स्क्रिप्ट के लिए क्रॉन जॉब जिसके लिए बहुत लंबे निष्पादन समय की आवश्यकता होती है

यदि मैं हर मिनट क्रॉन चलाता हूं, तो मुझे यह सुनिश्चित करने के लिए मिनट के अंत से 20 सेकंड पहले स्क्रिप्ट के आखिरी पाश को रोकने की आवश्यकता है ताकि वर्तमान लूप समय पर समाप्त हो सके। घंटे के दौरान यह बहुत बर्बाद समय तक बढ़ जाता है।

मैं सोच रहा हूं कि PHP निष्पादन समय सीमा को सरल करने और स्क्रिप्ट को एक घंटे में चलाने का बुरा विचार है और इसे पूरा होने के लिए चलाएं .... क्या यह एक बुरा विचार है?

+1

क्या आपका क्रॉन जॉब PHP चलाने वाली वेबसाइट या कमांड लाइन से PHP का उपयोग कर रहा है? मैं दूसरे अनुच्छेद को पूरी तरह से समझ नहीं पा रहा हूं - आप प्रसंस्करण को क्यों रोकते हैं और हर मिनट फिर से शुरू करते हैं? –

+0

मुझे लगता है कि यदि आप बताते हैं कि नौकरी की क्या ज़रूरत है तो आपको यहां कुछ और उत्पादक उत्तर मिल सकते हैं। ऐसा करने के लिए एक और अधिक प्रभावी तरीका हो सकता है। – ocodo

उत्तर

5

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

आप pcntl functions का उपयोग करके स्क्रैच से एक डिमन लिख सकते हैं (क्योंकि आप परवाह नहीं है कई कार्यकर्ता प्रक्रियाओं, यह एक प्रक्रिया पृष्ठभूमि में चल रहा।) प्राप्त करने के लिए, या धोखा और सिर्फ एक स्क्रिप्ट है कि हमेशा से चले और screen के माध्यम से इसे चलाने के लिए, या नाशपाती के System:Daemon या nanoserv

एक बार की तरह कुछ ठोस पुस्तकालय कोड का लाभ उठाने super-easy है डिमोनिज़ेशन सामान का ख्याल रखा जाता है, आप सभी को वास्तव में परवाह है कि एक लूप है जो हमेशा के लिए चलता है। आप यह ध्यान रखना चाहेंगे कि आपकी स्क्रिप्ट स्मृति को रिसाव नहीं करती है, या बहुत से संसाधनों का उपभोग नहीं करती है।

आमतौर पर, आप की तरह कुछ कर सकते हैं:

<?PHP 
// some setup code 
while(true){ 
    $todo = figureOutIfIHaveWorkToDo(); 
    foreach($todo as $something){ 
     //do stuff with $something 
     //remember to clean up resources so you don't leak memory! 
     usleep(/*some integer*/); 
    } 
    usleep(/* some other integer */); 
} 

और यह बहुत अच्छी तरह से काम करेंगे।

0

मैंने अतीत में समान लंबे समय तक चलने वाले कार्यों के लिए php कमांड-लाइन इंटरफ़ेस का उपयोग किया है। आप शायद किसी भी अनुरोध के लिए निष्पादन समय सीमा को हटाना नहीं चाहते हैं।

0

एक अच्छा विचार की तरह लगता है कि इसमें एक घंटा से अधिक समय लगेगा। नोट, हालांकि, गलत बग अपेक्षा से अधिक समय लेना वास्तव में एक अच्छा तरीका हो सकता है ..

सभी प्रकार की ग़लत समस्याओं से बचने के लिए, आपके पास स्क्रिप्ट की प्रक्रिया आईडी के साथ एक गार्ड फ़ाइल होनी चाहिए। स्टार्टअप पर, आपको यह सुनिश्चित करने के लिए जांच करनी चाहिए कि फ़ाइल मौजूद नहीं है, या यदि ऐसा होता है कि फ़ाइल में प्रक्रिया आईडी मौजूद नहीं है (एक हत्या (पिड, 0) कॉल के माध्यम से)। यदि इन शर्तों को पूरा किया जाता है, तो स्क्रिप्ट के पीआईडी ​​के साथ एक नई फ़ाइल बनाएं और जब आप पूरा कर लें तो फ़ाइल को हटा दें।

यह वही चाल है जो कई डिमन्स यह सुनिश्चित करने के लिए उपयोग करती है कि यह पहले से चल रहा नहीं है। अगर डिमन अचानक मारा गया था, तो फाइल अभी भी मौजूद होगी लेकिन उस प्रक्रिया की पीआईडी ​​चलने की संभावना नहीं है।

1

समय सीमा को 0 पर सेट करना और इसे अपनी बात करना देना PHP आधारित cronjobs (मेरे अनुभव में) का काफी विशिष्ट है, लेकिन यह भी वह बिंदु है जब आपको खुद को कुछ महत्वपूर्ण प्रश्न पूछना चाहिए, जैसे "मुझे चाहिए एक संकलित भाषा में इस नौकरी को फिर से लिखें? " और "क्या मैं अपने सभी उपकरणों (डेटाबेस, आदि) का उपयोग अपनी अधिकतम दक्षता में कर रहा हूं?"

यह कहा गया है कि, समय सीमा को पूरी तरह से हटाने से बेहतर होगा, इसे वास्तव में ऊपरी सीमा तक सेट करना होगा जो आप वास्तव में चाहते हैं। यदि इसका अर्थ 48 मिनट है, तो set_time_limit(48 * 60);

0

आपकी स्क्रिप्ट के आधार पर, यदि आप समय सीमा को हटाते हैं तो इससे समस्याएं पैदा हो सकती हैं। यदि प्रति उदाहरण है, तो आप एक बाहरी सर्वर को मतदान कर रहे हैं जो नौकरी चल रहा है, जबकि उत्तरदायी नहीं है, और आपके क्रॉन को पूरा करने के लिए 30 मिनट के बजाय 2 घंटे लगते हैं, तो आप पिछली बार हेवन होने पर भी PHP प्रक्रियाओं का एक ढेर निकाल सकते हैं अभी तक पूरा नहीं हुआ यह सिस्टम अस्थिरता और दुर्घटनाओं का कारण बन सकता है।

  • सुनिश्चित करें कि अपनी स्क्रिप्ट का कोई अन्य उदाहरण पहले से चल रहा है अन्यथा शुरुआत पर बाहर निकलने(),:

    आप शायद दो विकल्प हैं।

  • अपने cronjob को एक डेमॉन में बदलने पर विचार करें।
1

मुझे सच में लगता है कि आपको समय 0 पर सेट नहीं करना चाहिए, जो केवल परेशानी की तलाश में है। सबसे अधिक, इसे 59 * 60 सेकेंड पर सेट करें, लेकिन इसे 0 पर सेट करने से सुरक्षा समस्याएं हो सकती हैं, यदि कोई स्क्रिप्ट लटकती है, तो यह सर्वर के होस्ट निष्पादन को रोकने तक लगभग हमेशा तक लटकाएगा। ऐसा करने के लिए इसे बुरा अभ्यास माना जाता है।

0

क्या इसे घड़ी की घड़ी की तरह प्रति घंटा चलाना है?

यदि नौकरी को विभाजित नहीं किया गया है (आपने बताया कि यह एक से अधिक सरल कार्य था) प्रत्येक कार्य प्रत्येक घंटे करते हैं?

या प्रति उपयोगकर्ता इसे विभाजित करें, घंटे पर ए-एम करें, फिर अगला एन-जेड करें?

2

max_execution_time सेट करने के बजाय आप प्रत्येक लूप पर काउंटर रीसेट करने के लिए set_time_limit() का भी उपयोग कर सकते हैं। इससे यह सुनिश्चित होगा कि आपकी स्क्रिप्ट कभी भी समय से बाहर नहीं चल रही है जब तक कि वर्तमान लूप में कुछ गंभीर लटकती न हो (और max_execution_time से अधिक समय लेना)।

असल में यह आपकी स्क्रिप्ट को तब तक चलाना चाहिए जब तक इसे दो set_time_limit() कॉल के बीच 30 सेकंड का टाइमआउट देने की आवश्यकता हो।

+0

यह एक अच्छी सलाह है। मुझे यकीन नहीं है कि आपके पास पर्याप्त वोट क्यों नहीं हैं। – dinwal

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