बन जाता है तो बच्चे को मार दें मुझे कोड का यह ब्लॉक मिला है जो मेरे विभिन्न PHP क्लिप कार्यक्रमों में मेरी आवश्यकताओं के लिए पूरी तरह से काम करता है। सिवाय इसके कि कभी-कभी एक बच्चा ज़ोंबी बन जाएगा।PHP फोर्किंग: जब यह ज़ोंबी
मेरा प्रश्न यह है कि कोई बच्चा 5 मिनट के लिए कहता है कि क्या यह जांचने के लिए कोड रखना है और यदि यह लंबे समय तक इसे मारने के लिए है?
मुझे यह जानने के लिए posix_kill के बारे में पता है और इसका ट्रैक कैसे रखें। There are examples of taskmanagers here।
मुझे यकीन है कि कोड में इन नई सुविधाओं को कैसे जोड़ना है। हर बार जब मैं कोशिश करता हूं, मैं बस एक गड़बड़ में मिलता हूं। हो सकता है कि कोई जो फोर्किंग के बारे में जानता हो, मेरे कोड को ठीक कर सकता है?
सभी त्रुटि_लॉगों को अनदेखा करें - मुझे यह देखना पसंद है कि यह कब चल रहा है। सब से
public function __construct($data) {
//Keep track of all of the children processes
$this->children = Array();
//Specify the maximum number of child processes to fork at any given time
$this->max_children = 5;
}
private function process()
{
foreach ($collection as $stuff)
{
//FORK THE PROCESS
$pid = pcntl_fork();
//Something went wrong
if($pid == -1)
{
error_log ("could not fork");
die();
}
//PARENT PROCESS
if($pid)
{
//error_log ("Parent: forked " . $pid);
$this->children[] = $pid;
}
//CHILD PROCESS
else
{
// Do stuff here
exit(); //Exit the child thread so it doesn't continue to process the data
}
//COLLECT ALL OF THE CHILDREN AS THEY FINISH
while(($c = pcntl_wait($status, WNOHANG OR WUNTRACED)) > 0)
{
//error_log ("Collected Child - " . $c);
$this->remove_thread($this->children, $c);
error_log ("children left: " . count($this->children));
}
//WAIT FOR A CHILD TO FINISH IF MAXIMUM PROCESSES IS EXCEEDED
if(sizeof($this->children) > $this->max_children)
{
//error_log ("Maximum children exceeded. Waiting...");
if(($c = pcntl_wait($status, WUNTRACED)) > 0)
{
//error_log ("Waited for Child - " . $c);
$this->remove_thread($this->children, $c);
error_log ("children left: " . count($this->children));
}
}
}
//COLLECT ALL OF THE CHILDREN PROCESSES BEFORE PROCEEDING
while(($c = pcntl_wait($status, WUNTRACED)) > 0){
//error_log ("Child Finished - " . $c);
$this->remove_thread($this->children, $c);
error_log ("children left: " . count($this->children));
}
}
//Function to remove elements from an array
private function remove_thread(&$Array, $Element)
{
for($i = 0; $i < sizeof($Array); $i++)
{
//Found the element to remove
if($Array[$i] == $Element){
unset($Array[$i]);
$Array = array_values($Array);
break;
}
}
}
बहुत बढ़िया शीर्षक ... –
बच्चे, क्योंकि वे काटा नहीं किया गया है लाश बन इसलिए नहीं कि वे अभी भी जीवित हैं ... –
@Ignacio - वहाँ उदाहरण है जब कहते हैं, मैं कर्ल के माध्यम से एक प्रॉक्सी जाँच कर रहा हूँ कर रहे हैं। ऐसे समय होंगे जब वह बच्चा उत्तरदायी नहीं हो जाता है क्योंकि कर्ल अस्थिर हो गया है और फिर यदि मैं जल्द ही या बाद में 1000 प्रॉक्सी जांच रहा हूं तो मेरे सभी बच्चे ज़ोंबीकृत हैं। तो यह एक उदाहरण है जहां मुझे यह जानने की जरूरत है कि वे कितने समय तक चल रहे हैं इसलिए मैं उन्हें मार सकता हूं और नए बच्चों को बना सकता हूं। – PaulM