Я пытаюсь запустить цикл for для нескольких процессов, и мне нужно, чтобы каждый цикл for записывал в массив в родительском процессе. Я пытался выйти из дочернего процесса с массивом, но pcntl_wexitstatus()
можно вернуть только целое число. И вот я застрял.
Я очень новичок в многопроцессорности, однако я видел, как люди говорят, что хорошее решение для разделения переменных между родителем и ребенком shmop
, но я не знаю, как его использовать.
Вот мой код:
$output = array();
for ($i = 0; $i < 4; $i++) {
$pid = pcntl_fork();
$start = ($i == 0) ? 1 : (1000000 * $i) + 1;
$end = 1000000 * ($i + 1);
if (!$pid) {
for ($run = $start; $run <= $end; $run++) {
$output[$i][] = 'Run ' . $run;
}
exit($i);
}
}
while (pcntl_waitpid(0, $status) != -1) {
$status = pcntl_wexitstatus($status);
}
echo implode("\n", $output);
Просто чтобы уточнить, что я ожидаю, $output
массив должен содержать четыре элемента, которые также являются массивами по миллиону элементов в каждом. Это должно выглядеть так:
Array
(
[0] => Array
(
[0] => Run 1
[1] => Run 2
[2] => Run 3
...
)
[1] => Array
(
[0] => Run 1000001
[1] => Run 1000002
[2] => Run 1000003
...
)
[2] => Array
(
[0] => Run 2000001
[1] => Run 2000002
[2] => Run 2000003
...
)
[3] => Array
(
[0] => Run 3000001
[1] => Run 3000002
[2] => Run 3000003
...
)
)
Php fork (как fork в NIX) — это всего лишь полная копия процесса и ее env. Родительский процесс не известен изменений у детей. И дети не могут передать результаты родителю. Родитель может проверять только завершение дочерних процессов. Если вы хотите передать данные, вы можете использовать общую память. Но внимание! Разделяемая память в php это не реальная (ОС) разделяемая память. Но для PHP это работает.
Вы можете найти решения здесь: https://github.com/search?q=php+fork
Других решений пока нет …