Tengo este bloque de código que funciona perfectamente para mis necesidades en mis diversos programas php cli. Excepto que a veces un niño se convertirá en un zombie.PHP Bifurcación: matar a un niño cuando se convierte en un zombi
Mi pregunta es dónde colocar el código para verificar si un niño corre, por ejemplo, durante 5 minutos y si es más largo que matarlo.
Sé acerca de posix_kill para matarlo y cómo seguirlo. There are examples of taskmanagers here.
No estoy seguro de cómo combinar estas nuevas características en el código. Cada vez que intento hacerlo, me meto en un desastre. ¿Tal vez alguien que sabe sobre bifurcación puede arreglar mi código?
Ignora todos los errores_logs - Me gusta ver qué sucede cuando se ejecuta.
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;
}
}
}
Título impresionante ... –
Los niños se vuelven zombis porque no han sido cosechados, no porque todavía estén vivos ... –
@Ignacio - hay casos en los que decir, estoy comprobando un proxy mediante curl. Habrá momentos en los que el niño no responderá porque Curl se ha despegado y, luego, si estoy verificando 1000 proxies, tarde o temprano todos mis hijos estarán zombificados. Así que ese es un caso en el que necesito saber cuánto tiempo han estado corriendo para poder matarlos y crear nuevos hijos. – PaulM