2012-06-21 13 views
5
<?php 
while(true){ 
//code goes here..... 
} 
    ?> 

मैं एक PHP वेब सर्वर बनाने जा रहा हूं, तो क्या यह स्क्रिप्ट कर्ल के साथ हमेशा के लिए चलती है?क्रॉन नौकरी के साथ हमेशा के लिए चलाने के लिए एक PHP स्क्रिप्ट बना सकते हैं?

+1

आपको जो चाहिए वह 'सत्य (सत्य)' है, और हाँ यह तब तक चल रहा है जब तक कुछ घटित न हो (अधिमानतः आपके द्वारा निर्दिष्ट ब्रेकिंग स्थिति के कारण) – Adi

+0

@AdnanShammout यह कुछ समय बाद स्वचालित रूप से समाप्त हो जाएगा। PHP में एक सेट अधिकतम निष्पादन समय अंतर्निहित है, जब तक कि आप अपने कोड में उस सेटिंग को संशोधित न करें। –

+0

@DexterHuinda, PHP निष्पादन सीमा केवल वेब ब्राउज़र से चलते समय लागू होती है। कमांड 'php server.php' के रूप में चलते समय सीमा लागू नहीं होती है। किसी भी वेब ब्राउज़र से सर्वर हमेशा के लिए क्यों चलाना चाहते हैं? – Adi

उत्तर

15

अधिकतम निष्पादन समय को अनंत (0) पर सेट करना न भूलें।

बेहतर

सुनिश्चित करें कि आप एक से अधिक उदाहरण समाप्त न हो, कि यदि आपका इरादा क्या है:

ignore_user_abort(true);//if caller closes the connection (if initiating with cURL from another PHP, this allows you to end the calling PHP script without ending this one) 
set_time_limit(0); 

$hLock=fopen(__FILE__.".lock", "w+"); 
if(!flock($hLock, LOCK_EX | LOCK_NB)) 
    die("Already running. Exiting..."); 

while(true) 
{ 

    //avoid CPU exhaustion, adjust as necessary 
    usleep(2000);//0.002 seconds 
} 

flock($hLock, LOCK_UN); 
fclose($hLock); 
unlink(__FILE__.".lock"); 

CLI मोड में है, तो बस फ़ाइल को चलाने के।

एक वेबसर्वर पर एक और PHP में, आप एक जो (बजाय cURL का उपयोग कर, यह एक निर्भरता को नष्ट करने की) इस तरह infinetely चलाना चाहिए शुरू कर सकता है, तो:

$cx=stream_context_create(
    array(
     "http"=>array(
      "timeout" => 1, //at least PHP 5.2.1 
      "ignore_errors" => true 
     ) 
    ) 
); 
@file_get_contents("http://localhost/infinite_loop.php", false, $cx); 

या आप का उपयोग कर linux क्रॉन से शुरू कर सकता है इस तरह wget:

`* * * * * wget -O - http://localhost/infinite_loop.php` 

या आप जो इस में शामिल है एक .bat फ़ाइल चल bitsadmin का उपयोग कर विंडोज समयबद्धक से शुरू कर सकता है:

bitsadmin /create infiniteloop 
bitsadmin /addfile infiniteloop http://localhost/infinite_loop.php 
bitsadmin /resume infiniteloop 
+1

फ़ाइल हैंडल का उपयोग कर अच्छी लॉकिंग तकनीक, अंगूठे ऊपर! –

+0

उपरोक्त अप! ... –

+0

ने यह सुनिश्चित करने के लिए ignore_user_abort जोड़ा है कि स्क्रिप्ट समाप्त नहीं होती है क्योंकि वेब वातावरण में कॉलर अनुरोध को त्याग देता है। –

0

डिफ़ॉल्ट रूप से, नहीं क्योंकि PHP में निष्पादन समय सीमा है। देखें: http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time

आप इसे मान सेट या तो द्वारा हमेशा के लिए चलाने के लिए या अपनी स्क्रिप्ट में set_time_limit फोन कर सकते हैं (http://php.net/manual/en/function.set-time-limit.php)।

लेकिन मैं इसकी अनुशंसा नहीं करता क्योंकि PHP (HTTP अनुरोध द्वारा बुलाया गया) को अनंत लूप रखने के लिए डिज़ाइन नहीं किया गया है। यदि आप कर सकते हैं, तो स्थानीय स्क्रिप्ट का उपयोग करें, या अक्सर कार्य करने के लिए अंतराल में पृष्ठ का अनुरोध करें।

यदि आपकी वेबसाइट अन्य लोगों द्वारा अक्सर ब्राउज़ की जाती है तो आप इसे इसके बजाय प्रत्येक पृष्ठ में कर सकते हैं।

(और कल्पना अगर कोई स्क्रिप्ट एक बार से अधिक अनुरोध करता है, आपके द्वारा चलाए जा इसके बारे में कई उदाहरण होगा)

+0

यह केवल तभी लागू होता है जब किसी वेब ब्राउज़र से चलते हैं – Adi

+0

@AdnanShammout उन्होंने 'curl' कहा है तो सबसे अच्छा अनुमान HTTP अनुरोध –

+0

से चल रहा होगा क्या आप मुझे उस अनुमान प्रक्रिया के माध्यम से मार्गदर्शन करेंगे? मैं नहीं देखता कि वेब ब्राउज़र से 'curl' कैसे चल रहा है। – Adi

0

आप ऐसा आप set_time_limit (0) अपनी स्क्रिप्ट में, इसे किसी और सेट केवल तभी कर सकते हैं max_execution_time कॉन्फ़िगरेशन में सेट के बाद निष्पादन रोक देगा।

और आप जबकि (सत्य) स्थिति का उपयोग कर रहे हैं, जो आपकी स्क्रिप्ट को हमेशा चलाने के लिए तैयार करेगा।

1

एक php कोड हमेशा के लिए चलाने के लिए के लिए, यह एफएफ .:

  • set_time_limit(0); // तो php के रूप में सामान्य समाप्त नहीं करेंगे, तो आप सामान कर रही होगी कि अगर एक बहुत लंबे प्रसंस्करण ले जाएगा होना चाहिए समय
  • [एक क्लाइंट-साइड स्क्रिप्ट की स्थापना के अंतराल में एक ही पृष्ठ को कॉल करने के द्वारा आम तौर पर] सक्रिय पेज रखते हुए देखें setInterval() के लिए
  • हैंडलर, setTimeout()

संपादित करें: लेकिन जब से तुम खंडिका हो जाएगा एक क्रॉन नौकरी में प्रवेश करना तो आप क्लाइंट-साइड हैंडलिंग से दूर रह सकते हैं।

संपादित करें: मेरा सुझाव, अनंत लूप का उपयोग नहीं करना है जब तक कि आपके पास कोई कोड न हो जो कुछ समय बाद लूप से बाहर निकलने के लिए कहता है। याद रखें, आप एक क्रॉन नौकरी का उपयोग कर एक ही पृष्ठ पर कॉल करेंगे, इसलिए लूप अनंत को रखने में कोई बात नहीं है। [संपादित करें] अन्यथा, आपको लॉकिंग सिस्टम की आवश्यकता होगी जैसा कि @ तिबेरियू-इओनुएट स्टैन द्वारा सुझाया गया है, इसलिए प्रत्येक बार क्रॉन नौकरी कहने पर केवल 1 उदाहरण चल सकता है।

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