В руководстве для pcntl_fork () говорится:
Функция pcntl_fork () создает дочерний процесс, который отличается от родительского процесса только своими PID и PPID.
Однако запуск этого простого теста меня удивил:
class Foo
{
public function bar()
{
if (pcntl_fork()) {
echo spl_object_hash($this), PHP_EOL;
} else {
echo spl_object_hash($this), PHP_EOL;
}
}
}
(new Foo)->bar();
Результат выглядит так:
000000005ec7fd31000000003f0fcfe6
000000006b4cd5fc000000007fee8ab7
Из того, что говорится в документации, я ожидал, что родитель и потомок будут использовать одни и те же переменные, и, в частности, когда fork () ed изнутри объекта, я ожидал, что ссылка на объект будет одинаковой в обоих процессы. Но приведенный выше пример показывает, что это не так.
Интересно отметить, что здесь не происходит клонирования, похоже, что объект просто скопирован. Если я добавлю __clone()
функцию, я вижу, что она не вызывается во время разветвления.
Есть ли причина, по которой переменные / объекты не используются обоими процессами, или какое-либо хорошее чтение по предмету?