Tôi đã có khối mã này hoạt động hoàn hảo cho nhu cầu của tôi trong các chương trình cli php khác nhau của tôi. Ngoại trừ rằng đôi khi một đứa trẻ sẽ trở thành một zombie.PHP Forking: Giết con khi nó trở thành một zombie
Câu hỏi của tôi là nơi đặt mã để kiểm tra xem một đứa trẻ có chạy trong vòng 5 phút và nếu nó còn lâu hơn để giết nó?
Tôi biết về posix_kill để giết nó và cách theo dõi nó. There are examples of taskmanagers here.
Tôi không chắc chắn cách kết hợp các tính năng mới này vào mã. Mỗi khi tôi cố gắng, tôi chỉ nhận được vào một mớ hỗn độn. Có lẽ ai đó biết về forking có thể sửa mã của tôi không?
Bỏ qua tất cả các error_logs - Tôi thích xem điều gì đang xảy ra khi nó chạy.
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;
}
}
}
Tiêu đề tuyệt vời ... –
Trẻ em trở thành thây ma vì chúng không bị gặt hái, không phải vì chúng vẫn còn sống ... –
@Ignacio - có trường hợp khi nói, tôi đang kiểm tra proxy qua curl. Sẽ có những lúc đứa trẻ đó trở nên không hồi đáp vì Curl đã trở nên bất tỉnh và sau đó nếu tôi kiểm tra 1000 proxy sớm hay muộn thì tất cả các con tôi đều bị kìm hãm. Vì vậy, đó là một ví dụ mà tôi cần phải biết bao lâu họ đã được chạy vì vậy tôi có thể giết họ và làm cho trẻ em mới. – PaulM