PHP Демоны. Как создать ограниченное количество одновременно работающих детей pcntl_fork?

Как создать ограниченное количество одновременно работающих детей pcntl_fork? Есть такой код, по задумке код достает из Redis json с ссылкой и классом, который передается дальше и в ребенке вызывается класс в который передается ссылка и потом в этом классе ссылка скачивается, мне надо чтобы создавалось 50-100 детей, которые будут выполнять это действие, чтобы ускорить процесс. Что я неправильно написал? Сейчас как бы я не менял условия всегда работает одновременно только 1 поток(ребенок). Вопрос в следующем: как правильно ограничить кол-во детей и сделать чтобы скрипт работал сразу в 50-100 потоков? И еще как сделать завершение программы по прохождению всех ссылок?

  public function secStart(){
        while (true) {
            $this->get_link = $this->reds->lpop($this->redlinks);
 
            if ($this->get_link != null) {
                $jd_link_class = json_decode($this->get_link, true);
 
                $pid = pcntl_fork();
 
                if ($pid == -1) {
                    $this->reds->lpush($this->redlinks, $this->get_link);
                    echo "cant create child, return link to redis " . $this->get_link . PHP_EOL;
                    die('could not fork');
                } else if ($pid) {
                    $this->liniks[$pid] = $this->get_link;
                    $this->child[] = $pid;
                    pcntl_wait($status); //Protect against Zombie children
                } else {
                    $this->isChild = true;
                    new $jd_link_class['class']($jd_link_class['link']);
                    exit();
                }
 
                while(count($this->child) == 500) {
                    foreach ($this->child as $chld => $pid) {
                        if (pcntl_waitpid($pid, $status, WNOHANG)) {
                            if (pcntl_wifexited($status)) {
                                echo "All downloaded, process pid = " . $pid . PHP_EOL;
                                unset($this->child[$chld]);
                                unset($this->liniks[$pid]);
                            } else {
                                $this->reds->lpush($this->redlinks, $this->liniks[$pid]);
                                echo "not normally exit from child, return link to redis " . $this->liniks[$pid] . PHP_EOL;
                                unset($this->child[$chld]);
                                unset($this->liniks[$pid]);
                            }
                        }
                    }
                }
            }
        }
    }
}


Ответы (0 шт):