Я хочу добиться следующего:
Инициализируйте массив. Детский процесс добавляет некоторые элементы в массив. Родительский процесс добавляет некоторые элементы в массив. Наконец, перед выходом, напечатайте все элементы.
Ниже приведен код, который я написал:
<?php $values=array(); $pid = pcntl_fork(); if (!$pid) { sleep(2); $values[]="Put by child"; exit(0); } $values[]="Put by parent"; pcntl_waitpid($pid, $status); print_r($values); ?>
Тем не менее, он печатает только одно значение – Put by parent
. Может ли кто-нибудь объяснить поведение и предложить правильный код?
С уважением, JP
Дети с вилкой получат свою собственную выделенную копию своего пространства памяти, как только они напишут где угодно – это «копирование на запись». Хотя shmop обеспечивает доступ к общей ячейке памяти, фактические переменные PHP и то, что не определено в сценарии, НЕ используются между дочерними элементами.
Выполнение $ x = 7; в одном ребенке не будет равно $ x в других дочерних элементах. Также каждый ребенок будет иметь собственный выделенный $ x, который полностью не зависит от копии остальных.
локальный доменный разъем проще всего. родитель должен открыть один с fsockopen для каждого ребенка непосредственно перед вилкой. Таким образом, у вас может быть один канал связи для каждого ребенка: http://php.net/manual/en/transports.unix.php и http://php.net/manual/en/transports.unix.php .
Вы также можете делиться памятью или открывать двунаправленный канал связи между двумя процессами и строить немного api для отправки данных взад и вперед.
До тех пор, пока отец и дети знают, что ключ / клавиши сегмента разделяемой памяти в порядке, выполните shmop_open перед pcnlt_fork. Но помните, что pcnlt_fork возвращает 0 в процессе дочернего процесса и -1 при неспособности создать ребенка (проверьте свой код рядом с комментарием / путаницей /). У отца будет в $ pid только что созданный PID дочернего процесса.
Проверьте это здесь:
(извините за crossposting)
Я предлагаю посмотреть на socket_create_pair () .
В руководстве по PHP очень короткий и простой пример межпроцессного взаимодействия (IPC) между fork () – родительским и дочерним.
И используя serialize () und unserialize () Вы можете даже переносить сложные типы данных, такие как массивы …
В коде ребенка отсутствует оператор print_r()
.
Родитель не будет печатать то, что ребенок добавил в values
, поскольку добавление было сделано после того, как дочерний процесс был fork()
отредактирован, и с этим он получил свою собственную копию памяти prcoess.
Из отрывка fork
tag (выделение мной):
Функция
fork()
– это способ Unix / Linux / POSIX для создания нового процесса путем дублирования вызывающего процесса.
Такое поведение forking отличается от потока, где все потоки имеют одинаковое адресное пространство.