Процесс виртуализации PHP – получение родительского вывода в родительском

Я хочу добиться следующего:

Инициализируйте массив. Детский процесс добавляет некоторые элементы в массив. Родительский процесс добавляет некоторые элементы в массив. Наконец, перед выходом, напечатайте все элементы.

Ниже приведен код, который я написал:

<?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 дочернего процесса.

Проверьте это здесь:

http://php.net/manual/es/function.pcntl-fork.php

(извините за crossposting)

Я предлагаю посмотреть на socket_create_pair () .

В руководстве по PHP очень короткий и простой пример межпроцессного взаимодействия (IPC) между fork () – родительским и дочерним.

И используя serialize () und unserialize () Вы можете даже переносить сложные типы данных, такие как массивы …

В коде ребенка отсутствует оператор print_r() .

Родитель не будет печатать то, что ребенок добавил в values , поскольку добавление было сделано после того, как дочерний процесс был fork() отредактирован, и с этим он получил свою собственную копию памяти prcoess.

Из отрывка fork tag (выделение мной):

Функция fork() – это способ Unix / Linux / POSIX для создания нового процесса путем дублирования вызывающего процесса.

Такое поведение forking отличается от потока, где все потоки имеют одинаковое адресное пространство.