2010-04-21 7 views
10

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

इस कार्य को हर बार एक क्रॉन का उपयोग करके चलाना एक सौदा का बड़ा नहीं है, लेकिन मुझे इसे हर मिनट चलाने की ज़रूरत है और मुझे पता है कि आखिरकार क्रॉन एक दूसरे के शीर्ष पर चलने लगेंगे और मेमोरी के मुद्दों का कारण बनेंगे।

जब आपको एक मिनट में कई बार कुशलता से चलाने की आवश्यकता होती है तो अगला कदम क्या होता है? मैं beanstalk & फेनस्टॉक के बारे में पढ़ रहा हूं और मुझे पूरी तरह से यकीन नहीं है कि अगर वह मुझे चाहिए तो वह करेगा। विचार ???

+0

यह सीधे आपके प्रश्न से संबंधित नहीं है, लेकिन छवियों को पुनर्प्राप्त करने के लिए CURL का उपयोग करें। यह DNS अनुरोध को कैश करता है, जबकि file_get_contents() और अन्य मूल फ़ाइल फ़ंक्शन नहीं करता है। मुझे छवियों को पुनर्प्राप्त करने के लिए एक बार स्क्रिप्ट करने की आवश्यकता थी, और बहुत अधिक निष्पादन समय नेटवर्क विलंबता था। तो इससे इसे कम करने में थोड़ा मदद मिल सकती है। – Savageman

उत्तर

7

या तो लॉकिंग तंत्र बनाएं ताकि स्क्रिप्ट ओवरलैप न हों। यह काफी सरल स्क्रिप्ट केवल हर मिनट चलाने के रूप में, एक सरल .lock फ़ाइल पर्याप्त होगा:

<?php 
    if (file_exists("foo.lock")) exit(0); 
    file_put_contents("foo.lock", getmypid()); 

    do_stuff_here(); 

    unlink("foo.lock"); 
?> 

यह सुनिश्चित करें कि स्क्रिप्ट समानांतर में समाप्त न हो जाएगा, तो आप सिर्फ यकीन है कि .lock फ़ाइल हटा दी जाती है करना है जब कार्यक्रम निकलता है, तो आपके पास बाहर निकलने का एक बिंदु होना चाहिए (शुरुआत में बाहर निकलने के अलावा)।

एक अच्छा विकल्प - जैसा कि ब्रायन रोच ने सुझाव दिया - एक समर्पित सर्वर प्रक्रिया है जो हर समय चलती है और कनेक्शन को IMAP सर्वर पर रखती है। इस भूमि के ऊपर एक बहुत कम कर देता है और भी बहुत एक सामान्य php स्क्रिप्ट लिखने की तुलना में कठिन नहीं है:

<?php 
    connect(); 
    while (is_world_not_invaded_by_aliens()) 
    { 
    get_mails(); 
    get_images(); 
    sleep(time_to_next_check()); 
    } 
    disconnect(); 
?> 
+2

मुझे लगता है कि डिमन मेरी सबसे अच्छी शर्त होगी और आईएमएपी को खोलने से चीजों को बहुत तेज बनाना चाहिए। सलाह के लिए धन्यवाद! – mike

10

मैं एक PHP लड़का नहीं हूं लेकिन ... क्या आपको अपनी स्क्रिप्ट को डेमॉन के रूप में चलाने से रोकता है? मैंने कई पर्ल लिपि लिखी हैं जो बस यही करती हैं।

+0

मैंने पहले कभी डेमॉन नहीं लिखा है, लेकिन अब मैं कुछ और शोध करना शुरू कर दूंगा। सलाह के लिये धन्यवाद। – mike

+0

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

+0

मैं 2 फाइलों का सुझाव दूंगा: पहला व्यक्ति एक और प्रक्रिया बनाता है जो डेमन चलाता है। पहला कुछ सेकंड इंतजार करेगा और जांच करेगा कि डिमन अभी भी चल रहा है या नहीं। यदि नहीं, तो यह इसे फिर से लॉन्च कर सकता है। मुझे वास्तव में इतने लंबे समय तक चलने के लिए PHP पर भरोसा नहीं है, इसलिए मुझे लगता है कि सावधानी बरतना बेहतर है। – Savageman

3

मैं इस तरह की स्क्रिप्ट है, जहां मैं मामले में वे ढेर में क्रॉन से उन्हें चलाने के लिए नहीं करना चाहते हैं की एक संख्या मिल गया है -अप।

#!/bin/sh 
php -f fetchFromImap.php 
sleep 60 
exec $0 

exec $0 हिस्सा स्क्रिप्ट को फिर से चलाने, स्मृति में ही जगह शुरू होता है, तो यह मुद्दों के बिना हमेशा के लिए चला जाएगा। जब भी यह निकलता है तो PHP स्क्रिप्ट का उपयोग करने वाली किसी भी स्मृति को साफ़ किया जाता है, इसलिए यह कोई समस्या नहीं है।

एक सरल रेखा में यह शुरू कर देंगे, और वह पृष्ठभूमि में डाल दिया:

cd /x/y/z ; nohup ./loopToFetchMail.sh & 

या यह इसी तरह शुरू किया जा सकता है जब मशीन इस तरह के क्रॉन के रूप में विभिन्न साधनों (साथ शुरू होता है '@reboot ....')

0

fcron http://fcron.free.fr/ यदि कोई पुराना अभी भी चल रहा है, तो नया काम शुरू नहीं होगा, आप @ 1 command का उपयोग कर सकते हैं और दौड़ की स्थिति के बारे में चिंता नहीं कर सकते।

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