2010-12-07 6 views
9

मैं एक PHP स्क्रिप्ट बना रहा हूं जो कमांड लाइन के माध्यम से चलाया जाएगा। इस स्क्रिप्ट के हिस्से के रूप में, ऐसे समय होते हैं जहां मुझे एक अलग स्क्रिप्ट को फेंकने/फोर्क करने की आवश्यकता हो सकती है जिसे पूरा करने में लंबा समय लग सकता है। मैं मूल स्क्रिप्ट को पूरा करने से अवरुद्ध नहीं करना चाहता हूं। अगर मैं जावास्क्रिप्ट के साथ ऐसा कर रहा था, तो मैं पृष्ठभूमि में AJAX अनुरोध चला सकता था। यह अनिवार्य रूप से मैं यहां करने की कोशिश कर रहा हूं। मुझे यह जानने की जरूरत नहीं है कि कांटे कब पूरा होते हैं, बस वे खुद को शुरू करते हैं और पूरा करते हैं।एक PHP स्क्रिप्ट को असीमित रूप से कैसे चलाएं?

मैं इन PHP स्क्रिप्ट को असीमित रूप से कैसे चला सकता हूं?

foreach ($lotsOfItems as $item) { 
    if ($item->needsExtraHelp) { 
     //start some asynchronous process here, and pass it $item 
    } 
} 
+0

आप कहते हैं और अपने कोड कहते हैं, "और यह $ आइटम पारित" "मैं जानता हूँ कि कांटे पूर्ण हो जाते हैं की जरूरत नहीं है"। क्या आप आउटपुट प्राप्त करना चाहते हैं या नहीं? – Jonas

+0

PHP थ्रेड पर मुकदमा नहीं करता है, आपको बाल प्रक्रियाओं को फोर्क करना है, या बेहतर तरीका है क्रॉन – RobertPitt

+0

नेको - नहीं, फोर्क को कुछ भी वापस करने की आवश्यकता नहीं होगी। – Andrew

उत्तर

2

int pcntl_fork (void)

pcntl_fork() समारोह एक बच्चे प्रक्रिया है कि केवल अपने पीआईडी ​​और PPID में माता-पिता की प्रक्रिया से अलग बनाता है। कृपया अपने सिस्टम के फोर्क (2) मैन पेज को विशिष्ट विवरण के लिए देखें कि कैसे आपके सिस्टम पर कांटा काम करता है।

विवरण: http://php.net/manual/en/function.pcntl-fork.php

संबंधित सवाल: PHP: What does pcntl_fork() really do?

प्रक्रिया नियंत्रण एक वेब सर्वर वातावरण में सक्षम नहीं किया जाना चाहिए और यदि कोई प्रक्रिया नियंत्रण कार्यों एक वेब सर्वर के भीतर उपयोग किया जाता है अनपेक्षित परिणाम हो सकता है वातावरण।

विवरण: http://www.php.net/manual/en/intro.pcntl.php

2

उपयोगकर्ता की तलाश में कार्यकारी पर नोट योगदान दिया है, आप इसे इस्तेमाल कर सकते हैं जैसे कि यह लग रहा है, बाहर की जाँच:

http://de3.php.net/manual/en/function.exec.php#86329

<?php 
function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
     pclose(popen("start /B ". $cmd, "r")); 
    } 
    else { 
     exec($cmd . " > /dev/null &"); 
    } 
} 
?> 

यह $ निष्पादित करेंगे PHP के बिना पृष्ठभूमि (कोई cmd विंडो) में cmd ओ विंडोज और यूनिक्स दोनों पर खत्म करें।

+0

http://www.php.net/manual/en/function.popen.php#92413 – gawpertron

3
$pids = array(); 
foreach ($lotsOfItems as $item) { 
    if ($item->needsExtraHelp) { 
     $pid = pcntl_fork(); 
     if ($pid == 0) { 
      // you're in the child 
      var_dump($item); 
      exit(0); // don't forget this one!! 
     } else if ($pid == -1) { 
      // failed to fork process 
     } else { 
      // you're in the parent 
      $pids[] = $pid; 
     } 
    } 

    usleep(100); // prevent CPU from peaking 
    foreach ($pids as $pid) { 
     pcntl_waitpid($pid, $exitcode, WNOHANG); // prevents zombie processes 
    } 
}