Что происходит за PHP pcntl_fork()?
Я потратил часы, дни, недели, пытаясь понять, как на самом деле работает PHP pcntl, и до сих пор не знаю точно, что на самом деле происходит.
Почему родители и дети? Я использую Debian (я далеко не специалист по компьютерам, должен признать), но все, что я хочу сделать, - это получить сообщение от моего клиента webSocket (что мне уже удалось сделать) и продолжать слушать других пользователей.
Другими словами, если я получаю сообщение и использую sleep(5);
тогда сервер не будет прослушивать другие сообщения, пока этот фрагмент кода не будет завершен.
Обратите внимание, что sleep(5)
для целей тестирования. Я планирую обрабатывать сотни сообщений одновременно, и поэтому пытаюсь выяснить, как можно pcntl
быть полезным
$pid = pcntl_fork();
echo "start\n";
if($pid) {
// parent process runs what is here
echo "parent\n";
}
else {
// child process runs what is here
echo "child\n";
}
echo "end\n";
Что именно происходит за вышеуказанным сценарием? Почему я получаю этот результат?
Начните
родитель
конец
Начните
ребенок
конец
Может кто-нибудь объяснить мне, что компьютер "думает"?
1 ответ
Это в основном то, что происходит:
pcntl_fork()
||
+----------------++------------------+
parent child
"start" ...
"parent" ...
"end" ...
"start"
"child"
"end"
Любой код после pcntl_fork()
исполняется как родительским, так и дочерним процессом; вы можете думать о ребенке как о клоне родителя, за исключением того, что результат pcntl_fork()
является 0
; как будто код входит в другую реальность, мало чем отличающуюся назад в будущее;-)
Это только один из возможных результатов, хотя; в зависимости от использования процессора "начало" ребенка может происходить вместе с "родительским" выводом родителя.