2010-05-15 12 views
17

वैसे मूल रूप से मैं एक ऐसी स्क्रिप्ट निष्पादित करना चाहूंगा जिसमें 1 घंटे तक का समय लग सकता है।एक बड़ी PHP स्क्रिप्ट निष्पादित करने के लिए कैसे?

मैं वास्तव में क्या करना चाहता हूं वह है कि मेरे उपयोगकर्ताओं को किसी तृतीय पक्ष API का उपयोग करके एसएमएस भेजें। तो इसकी मूल रूप से मैं अपनी स्क्रिप्ट को फ़ोन नंबरों की एक सरणी के साथ आपूर्ति करता हूं और एसएमएस भेजने के लिए विधि को आग लगाता हूं।

हालांकि मानते हैं कि 1 एसएमएस भेजने में 5 सेकंड लगते हैं और मैं 1000 एसएमएस भेजना चाहता हूं जो लगभग 1 - 2 घंटे है। मैं set_time_limit() का उपयोग नहीं कर सकता क्योंकि मैं साझा होस्ट पर हूं।

ऐसा करने का एक तरीका एक सत्र में स्टोर नंबर है और प्रत्येक एसएमएस निष्पादित करता है और अंत तक उस पृष्ठ को रीफ्रेश करने के लिए जावास्क्रिप्ट का उपयोग करता है। इस तरह मुझे अपने ब्राउज़र को खोलने की आवश्यकता है और अगर मेरा इंटरनेट कनेक्शन डिस्कनेक्ट हो गया है तो निष्पादन बंद हो जाएगा।

तो, क्या ऐसा करने का कोई बेहतर तरीका है?

आशा है कि मैं समझाने के लिए पर्याप्त हूं कि मैं क्या चाहता हूं? मैं एक बड़ी स्क्रिप्ट निष्पादित करना चाहता हूं जिसमें टाइमआउट प्राप्त किए बिना निष्पादित करने में घंटों लग सकते हैं।

+0

पर सेटअप एक स्थानीय कंप्यूटर जहां सवाल से बाहर समय सीमा बढ़ा सकते हैं से एपीआई से बात कर रही है कर सकते हैं? –

+1

क्या आपके पास अपने साझा होस्ट पर क्रॉन नौकरियां सेट करने की क्षमता है? – Mathew

+0

हां, मेरे पास क्रॉन नौकरियों तक पहुंच है –

उत्तर

4

यदि आपका होस्ट आपको देता है, तो क्रॉन जॉब्स सबसे अच्छा समाधान है। एक क्रॉन जॉब मूल रूप से एक सामान्य PHP स्क्रिप्ट है जो स्वचालित रूप से एक निश्चित समय अंतराल पर वेब सर्वर द्वारा चलाया जाता है। आपकी ज़रूरतों के लिए मैं एक स्क्रिप्ट तैयार करूंगा जो हर 5 मिनट चलाती है और 100 की बैचों में आपकी संख्या को संसाधित करती है (जाहिर है कि आप समय अंतराल और बैच आकार को सूट करने के लिए ट्विक करना चाहते हैं)। यह आपके सर्वर को लोड रखेगा और आपको होस्टिंग संसाधनों के लिए अपने होस्टिंग प्रदाता के साथ परेशानी में आने से रोक देगा।

यह ट्रैक करने के लिए कि आपकी स्क्रिप्ट को कौन सी बैच प्रसंस्करण करनी चाहिए, मैं एक ट्रैक_बैच तालिका सेट अप करूंगा।

आईडी, date_run, start_record, end_record,

मूलतः

final_run:

  • चेक पिछले बैच की तारीख को देखने के लिए ये कॉलम आप कैसे समस्या दृष्टिकोण का एक अच्छा संकेत देना चाहिए चलाते हैं। यदि वर्तमान बैच के लिए वर्तमान दिनांक (या जो भी अन्य पहचानकर्ता आप उपयोग करते हैं) नहीं है, तो आगे बढ़ें।
  • तो अंतिम बैच रन आज की तारीख के लिए था, तो final_run स्तंभ जांच करें कि आप पहले से ही प्रसंस्करण सभी नंबरों को समाप्त किया है।
  • आप अभी भी प्रक्रिया के लिए नंबर हैं, तो शुरुआत का उपयोग और MySQL के LIMIT में डाटाबेस क्वेरी है कि आपके स्क्रिप्ट अगले बैच प्राप्त करने के लिए प्रयोग करेंगे का निर्माण करने के साथ संयोजन के रूप में रिकॉर्ड खत्म।
  • अपनी संख्याओं को संसाधित करें।
  • ट्रैक_बैच तालिका में इस बैच से सभी जानकारी स्टोर करें।
  • संख्या क्वेरी रिटर्न की राशि कभी अधिकतम बैच आकार से भी कम है, तो आप अंत पहुँच गए हैं और 1.

को final_run स्तंभ सेट कर सकते हैं एक बार जब आप मिल गया है अपने स्क्रिप्ट, आपको क्रॉन नौकरी को स्वयं स्थापित करने की आवश्यकता होगी। साझा मेजबानों के पास ऐसा करने के लिए अपने स्वयं के कस्टम इंटरफेस होने की संभावना है, इसलिए संभवतः वे आपकी स्क्रिप्ट को काम करने के बाद पूछने के लिए सबसे अच्छे लोग हैं।

5

कमांड लाइन से चल रहे PHP स्क्रिप्ट max_execution_time विकल्प से प्रभावित नहीं हैं।
तो आपको बिल्कुल चिंता करने की ज़रूरत नहीं है।

+0

और मैं उन्हें साझा होस्ट पर सीएलआई के रूप में कैसे चला सकता हूं? मुझे नहीं लगता कि मुझे इसका उपयोग होगा। –

+0

हाँ सही है। धन्यवाद :) –

+1

देखें कि आपके नियंत्रण कक्ष में आपके पास "क्रॉन" अनुभाग है या नहीं। इससे आपको कमांड लाइन के माध्यम से PHP स्क्रिप्ट चलाएंगे। – zundi

0

आप कर सकते हैं या आप नहीं कर सकते उपयोग set_time_limit()?

आप .. इसका इस्तेमाल कर सकते हैं:

<?php 
// Runs forever and ever... 
set_time_limit(-1); 
?> 
+8

हे, मैं डाउनवोट नहीं करूँगा क्योंकि यह तकनीकी रूप से सही है, लेकिन क्या आप सुझाव देंगे कि वह एक स्क्रिप्ट को हमेशा के लिए चलाने की इजाजत देता है अगर वह आपके साझा पड़ोसी पर * पड़ोसी था ?!:) – Mathew

20

एक PHP कमांड लाइन से या एक खोल स्क्रिप्ट, क्रॉन जॉब, आदि से निष्पादित स्क्रिप्ट समय समाप्त होने की जरूरत नहीं है।

सीएलआई-स्क्रिप्ट स्क्रिप्ट के लिए, भले ही आप set_time_limit() फ़ंक्शन के साथ गतिशील रूप से PHP स्क्रिप्ट का टाइमआउट सेट करें, इसका कोई प्रभाव नहीं पड़ता है।

+0

कृपया मेरे प्रश्न का उत्तर दें: http://unix.stackexchange.com/questions/98642/run-a-php-script-in-centos-and-time-and-timeout?noredirect=1#comment150287_98642 –

3

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

while($there_are_more_sms_to_be_sent){ 
    set_time_limit(30); // enough spare time, just in case. 

    // Do your sending, blah blah 
} 

इस तरह से, समय सीमा क्रमिक रूप से 30 सेकंड के लिए अद्यतन किया जाएगा:

इसके बजाय, यदि आप अनुमान प्रत्येक एसएमएस 5 सेकंड लेने के लिए जा रहा है, इस दृष्टिकोण का उपयोग करें। बेशक आपके पास उस एकल while के साथ अनंत लूप समस्या हो सकती है, लेकिन अगर आपके पास while के अंदर अन्य कॉल हैं तो सीमा को कॉल को दोषी ठहराएगी।

+0

हर बार यह loops, काउंटर रीसेट है? –

+0

यह सही है। मुझे लगता है कि आप एक cronjob भी इस्तेमाल कर रहे थे। आपको इस टिप के साथ इसे एक साथ उपयोग करना चाहिए, इसलिए आप प्रत्येक बार 100 संदेश संसाधित करते हैं, लेकिन यह भी सुनिश्चित करते हैं कि आप समय से बाहर नहीं निकलते हैं। – Seb

+0

क्या आप वाकई इस तरह क्रॉन नौकरियों को रोक सकते हैं? – zehelvion

0

जावास्क्रिप्ट का उपयोग करने के लिए एक वैकल्पिक अपने पृष्ठ के लिए Refresh मेटा टैग को जोड़ने के लिए है:

<meta http-equiv="Refresh" content="2; url=http://yoururl/script.php&step=x" ?> 

content="2; url=.. में दो ब्राउज़र बताता यूआरएल 2 सेकंड लोड करने के लिए पृष्ठ के लोड होते हैं।

+1

धन्यवाद लेकिन, मैंने पहले ही इसे अपने प्रश्न में निर्दिष्ट किया है। मैं सर्वर साइड द्वारा कुछ करने की तलाश में था। मैं सीआरओएन के बारे में भी जानता था, लेकिन मैंने सोचा कि –

+0

के लिए और अधिक तरीके हो सकते हैं, वह स्पष्ट रूप से पूछ रहा है कि कैसे .... PHP प्रौद्योगिकी वर्कअराउंड सबसे अच्छा समाधान नहीं है –

+0

मुझे नहीं पता कि आपको पोस्ट पर प्रतिक्रिया करने के लिए क्यों जरूरी लगता है लगभग 7 साल पुराना है, लेकिन उत्तर देने के लिए: क्रॉन या कमांड लाइन जॉब का उपयोग करते समय बड़े बैच ऑपरेशंस चलाने के लिए एक बहुत अच्छा समाधान है, नौकरी को छोटे चरणों में विभाजित करना और चरण-दर-चरण को निष्पादित करना उतना ही वैध है। क्रॉन अच्छा है जहां आप इसका उपयोग कर सकते हैं, लेकिन मैंने सफलतापूर्वक उन स्क्रिप्ट को चलाया जो ब्राउज़र में 12 घंटे से अधिक समय लेते थे जब मेरे पास खोल पहुंच नहीं थी। – Matijs

0

मामले में आप चला सकते हैं क्रॉन नौकरियों

मैं आमतौर पर एक कतार, एक प्रबंधक और कर्मी हैं। जब तक आप इस मॉडल को आपकी मदद कर सकते हैं, तब तक आप एसएमएस एपीआई को कॉल नहीं कर सकते हैं, और आप टाइमआउट के बारे में चिंता नहीं करेंगे क्योंकि प्रत्येक कर्मचारी इसे प्रबंधित करेगा।

मैं की तरह कुछ है:

<?php 
// PSEUDO CODE 
// grab pending from queue 

// <for> { 
// update to running 
exec("/usr/bin/php /path/to/send.php {$id} > /dev/null &"); 
// } 

और send.php प्रत्येक एसएमएस भेजेगा। अभी मैं इस 300/मिनट की दर से चल रहा है के बाद से अधिकतम आवृत्ति है कि आप एक क्रॉन जॉब

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