2010-01-21 12 views
5

मैं एक बहुत अजीब बग प्रतीत होता है कि ट्रैक करने की कोशिश कर रहा हूँ। मेरे पास एक ऐसा एप्लीकेशन है जो लगभग निम्नानुसार संरचित है:क्या PHP स्क्रिप्ट समाप्त हो सकती है भले ही set_time_limit (0) सेट हो?

set_time_limit(0); 
register_shutdown_function('logScriptCompletion'); 

function logScriptCompletion() { 
    log('script completed'); 
} 

log('script started'); 

// do some calculations periodically printing out progress 

स्क्रिप्ट को चलाने में कुछ समय लग सकता है। वांछित व्यवहार स्क्रिप्ट के अंत में कंप्यूटिंग जारी रखने के लिए है, भले ही स्टॉप बटन मारा गया हो या कनेक्शन गिरा दिया गया हो। 99% बार यह अपेक्षित के रूप में काम करता है।

एक समय में (शायद हर कुछ महीनों/हजारों अनुरोधों में से एक बार) गणना पूरी तरह से नहीं चलती है लेकिन दोनों "स्क्रिप्ट शुरू" और "स्क्रिप्ट पूर्ण" लॉग हैं और कोई अन्य त्रुटि घातक या अन्यथा नहीं है स्पष्ट (मेरे पास पूर्ण लॉगिंग सक्षम है)।

मुझे संदेह है कि सर्वर को छोड़ने के कनेक्शन के साथ इसका कुछ संबंध हो सकता है लेकिन इसकी पुष्टि करने के लिए कोई ठोस सबूत नहीं है। मैं लिनक्स पर अपाचे 2/PHP 5.2.6 चला रहा हूं।

क्या किसी और ने भी इसी तरह की समस्या देखी है और इस पर कुछ प्रकाश डालने में मदद कर सकते हैं?

उत्तर

9

बिल्कुल! आपको यह सुनिश्चित करने के लिए ignore_user_abort() function का भी उपयोग करना चाहिए।

+0

दिलचस्प। मेरे पास यह सेट नहीं था लेकिन स्क्रिप्ट बटन को मारने के बाद स्क्रिप्ट निष्पादित जारी रहेगी। यह बफरिंग के तरीके के कारण हो सकता है ... सुझाव के लिए धन्यवाद, मैं इसका परीक्षण करूंगा। –

4

एक विचार के रूप में, मुझे कभी-कभी लगता है कि नियमित रूप से अनुसूचित क्रॉन नौकरी से PHP के कमांड लाइन संस्करण का उपयोग करके ऐसी स्क्रिप्ट निष्पादित करना बेहतर विचार है। (अन्यथा, अगर किसी कारण से httpd को पुनरारंभ किया जाता है, तो प्रसंस्करण समाप्त हो जाएगा)

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

संसाधित करना पूर्ण था, पीएचपी तदनुसार डेटाबेस को अद्यतन करेगा, काम अंकन के रूप में संसाधित और प्रयोक्ता को ईमेल यदि आप चाहें, आदि

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

+0

+1, मुझे लगता है कि यह एक उत्कृष्ट सूचनात्मक उत्तर है। –

+0

लॉगिंग के बारे में अच्छा बिंदु। सीएलआई के माध्यम से चलने के संबंध में, यह कुछ है जो मैं निश्चित रूप से कुछ बिंदु पर करूँगा लेकिन दुर्भाग्यवश इसके लिए हमारे ऐप में महत्वपूर्ण कोड रीफैक्टरिंग की आवश्यकता है। Http पुनरारंभ करने के बारे में ... मुझे आश्चर्य है कि "httpd graceful" करना अभी भी चल रहे PHP स्क्रिप्स को समाप्त करता है। –

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

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