Возникла у меня ситуация когда нужно воспользоваться pcntl_fork().
Мучаюсь уже 2е сутки.
Еле разобрался с образованием процессов и в каких условиях кто и что выводит на экран.
В общем суть: пользователь нажимает ссылку. Запускается скрипт... в середине скрипт форкается, дитя отдаёт пользователю в брузер "Обновление баз запущенно". А родитель подождав ответа ребёнка об успешном завершении. Идёт дальше собственноручно обновлять базу. (логика была упрощена и сокращенна)
Не получается: родитель не видит завершения дитя... и в процессах висят и ребёнок (хотя уже выполнил скрипт) и родитель со статусом "wait".
и так у меня есть:
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- //.....some script
- switch ($pid = pcntl_fork()) { //форкаем процесс
- case -1: //если не получилось сфоркать
- $this->message.='Не удалось создать дочерний процесс.<br/>';
- return false;
- break; // кстати надо ли писать break, если до него было использованно return?
- case 0: //это выполняет дочерний процесс. собственно выводит сообщение, и должен умереть.
- $this->message.='Обновление баз запущенно! '.getmypid(); //для debug вывожу pid тк. сам он не умирает и его приходится килять.
- exit(); // exit должен был выполняться в функции, куда будет возвращено return. для теста был помещён тут.
- return true;
- }
- $pid = pcntl_waitpid($pid, $status, WUNTRACED); //тут родитель ждёт завершения ребёнка.
- file_put_contents('dump.txt', $status.' '.$pid); //записываем статус и полученный ppid ребёнка(получаем для уверенности, что именно дождались ответа ребёнка)
- exit;