2011-03-20 9 views
7

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

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

मेरा स्वयं का समाधान PHP में एक अनंत लूप बनाना है जो कमांड लाइन द्वारा चलता है। यह लूप मानचित्र के लिए डेटा को MySQL में रीफ्रेश करेगा साथ ही अन्य उपयोगी डेटा जैसे कि लूप टाइम और पिंग्स इत्यादि में असफल प्रयास रिकॉर्ड करेगा, फिर एक छोटी रोक (कुछ सेकंड) के बाद पुनरारंभ करें।

हालांकि - मुझे बार-बार लोगों द्वारा बताया जा रहा है कि एक PHP स्क्रिप्ट हमेशा के लिए चल रही है। थोड़ी देर के बाद यह रैम (और अन्य भयानक चीजों) के गीगाबाइट्स को हॉग करेगा

आंशिक रूप से मैं इस सवाल को लिखने के लिए लिख रहा हूं कि यह वास्तव में मामला है, लेकिन कुछ टिप्स और चालें कि मैं एक साफ लिखने के बारे में कैसे जाऊं लूप जो स्मृति को रिसाव नहीं करता है (यदि यह संभव है) अस्वस्थ नहीं होगा। इस मामले पर राय की भी सराहना की जाएगी।

उत्तर मुझे लगता है कि इस मुद्दे पर सबसे अधिक प्रकाश डालने वाला जवाब मैं सही के रूप में चिह्नित करूंगा।

+0

एक अविश्वसनीय रूप से मामूली बिंदु, लेकिन कृपया प्रश्नों पर हस्ताक्षर/साइन-ऑफ जोड़ें न जोड़ें। (उस तरफ, यह एक बहुत अच्छी तरह से निर्मित सवाल है।) :-) –

+0

क्षमा करें और धन्यवाद :-) – Hubro

उत्तर

4

लूप एक स्क्रिप्ट में होना चाहिए जो वास्तविक स्क्रिप्ट को एक अलग प्रक्रिया के रूप में सक्रिय/कॉल करेगा ... क्रॉन की तरह बहुत कुछ कर रहा है।
इस तरह, मेमोरी लीक होने पर भी, और गैर एकत्रित स्मृति जमा हो रही है, यह प्रत्येक चक्र के बाद मुक्त/मुक्त होनी चाहिए।

+0

मुझे एक उदाहरण पसंद आएगा। क्या आपका मतलब कुछ इस तरह का था? http://pastebin.com/SJeq9Xge – Hubro

2

हालांकि - मुझे बार-बार लोगों द्वारा बताया जा रहा है कि एक PHP स्क्रिप्ट हमेशा के लिए चल रही है। थोड़ी देर के बाद यह रैम (और अन्य भयानक चीजों) के गीगाबाइट्स को हॉग करेगा

यह बहुत सच था। PHP के पिछले संस्करणों में भयानकgarbage collection था, इसलिए लंबे समय से चलने वाली स्क्रिप्ट आसानी से उपयोग करने से कहीं अधिक स्मृति का आकस्मिक रूप से उपभोग कर सकती थीं। PHP 5.3 introduced a new garbage collector जो परिपत्र संदर्भों को समझ और साफ़ कर सकते हैं, "मेमोरी लीक" का नंबर एक कारण। यह डिफ़ॉल्ट रूप से सक्षम है। अधिक जानकारी और सुंदर ग्राफ के लिए उस लिंक को देखें।

जब तक आपका कोड उचित समय पर चर से बाहर जाने की अनुमति देने के लिए कदम उठाता है और अन्यथा वैरिएबल को अनसेट करने की अनुमति देता है जो अब उपयोग नहीं किया जाएगा, आपकी स्क्रिप्ट को PHP की अनावश्यक मात्रा का उपभोग नहीं करना चाहिए क्योंकि यह PHP है।

1

मुझे यह बुरा नहीं लगता है, जैसा कि आप लगातार चलाना चाहते हैं, आपको अधिक सावधान रहना होगा।

कार्य के साथ आपकी सहायता करने के लिए वहां पुस्तकालय हैं। System_Daemon पर एक नज़र डालें, जो एक महीने पहले आरसी 1 जारी करता है, जो आपको "अधिकतम रैम उपयोग जैसे विकल्पों को सेट करने" की अनुमति देता है।

1

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

  1. यह आरडीबीएमएस किसी भी लंबित कम प्राथमिकता अपडेट निष्पादित दूँगा:

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

  2. भले ही आप अपने द्वारा उपयोग किए जा रहे सभी अस्थायी चरों को अच्छी तरह से अनसेट करते हैं, फिर भी यह संभव है कि PHP स्मृति को "रिसाव" करेगा, हालांकि हालिया सुधार (5.2 ने एक नई मेमोरी प्रबंधन प्रणाली और कचरा संग्रह 5.3 में घटा दिया था) उम्मीद है कि का मतलब है कि यह एक मुद्दा कम है।

सामान्य तौर पर, यह भी (एक config परिवर्तन की वजह से अगर डीबी कनेक्शन अस्थायी रूप से नीचे चला जाता है और उदाहरण के लिए पुनः आरंभ) अन्य मुद्दों से निपटने के लिए आसान होगा यदि आप एक आदर्श में, क्रॉन दृष्टिकोण का उपयोग हालांकि दुनिया आप वैसे भी अपने कोड में ऐसी घटनाओं को पूरा करेंगे। (उसने कहा, पिछली बार मैंने जांच की थी, यह एक आदर्श दुनिया से बहुत दूर था।)

+0

1. क्या अनंत अंतराल का उपयोग करते समय यह भी मामला नहीं होगा, जब तक कि प्रत्येक अंतराल के बीच कोई विराम न हो? मेरे मामले में यह स्क्रिप्ट किसी भी समर्पित सर्वर पर चलती है। 2. क्या इसे एक PHP फ़ाइल चलाकर हल किया जा सकता है कि जब लूप, एक बार एक और PHP फ़ाइल निष्पादित करता है, तो ब्रेक लेता है? – Hubro

+0

@ कोडमनीकी 1. हां। 2. सिद्धांत में हां। हालांकि, मुझे अभी भी एक घबराहट महसूस हो रही है कि यह काफी विश्वसनीय नहीं होगा। उस ने कहा, तथ्य के बाद क्रॉन का उपयोग करने के लिए आपके द्वारा उल्लेख किए गए दृष्टिकोण को परिवर्तित करना तुच्छ होगा, इसलिए यह जाने का तरीका भी हो सकता है। (यानी: एक अलग "मोड" दृष्टिकोण में स्वयं की PHP स्क्रिप्ट स्पॉइंग प्रतियों को आज़माएं और यदि यह समय के साथ घटने के लिए देखा जाता है तो बस क्रॉन के माध्यम से एक ही स्क्रिप्ट को कॉल करें।) जब तक आप समय-समय पर 'memory_get_usage' के परिणामों को लॉग करते हैं,' memory_get_peak_usage', इत्यादि। यह निगरानी करना काफी आसान होना चाहिए कि चीजें कैसे चल रही हैं। –

0

सबसे पहले मैं यह देखने में असफल रहा कि आपको वर्णन की गई कार्यक्षमता प्रदान करने के लिए आपको डेमन स्क्रिप्ट की आवश्यकता है।

क्रॉन नौकरियों के पाठ्यक्रम एक संभावना हैं, लेकिन मैं डेटा की ताज़ा जैसे ही पिछले अंतराल

पूरा कर लिया है

न तो एक क्रॉन जॉब है और न ही एक डेमॉन को हल करने के तरीके हैं चाहते हो समस्या (जब तक कि स्क्रिप्ट स्क्रिप्ट के लिए डेटा सिंक नहीं हो जाता)। जब मैं आवंटन के लिए लॉकिंग रणनीति का उपयोग कर डेटा उपलब्ध होता हूं तो मैं एक पृथक प्रक्रिया उत्पन्न करता हूं।

लंबे समय तक चलने वाली PHP स्क्रिप्ट आंतरिक रूप से खराब नहीं हैं - लेकिन संदर्भ गिनती कलेक्टर गिनती की सफाई के लिए सभी संभावित परिदृश्यों से निपटता नहीं है - लेकिन हाल के कार्यान्वयन में एक और उन्नत संग्राहक है जो बहुत अधिक साफ करना चाहिए (परिपत्र संदर्भ चेकर)।

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