Как передать данные из дочернего процесса в основной процесс с помощью php pcntl?

Я запускаю некоторый процесс pcntl для вычисления некоторых данных и хочу дождаться завершения всех дочерних процессов и отправить все возвращаемые данные в главный процесс.

Как я могу это сделать?

моя черта pnctl такая:

<?php namespace App\Console\Commands;

trait PcntlTrait
{
private $workers = 1;

public function worker($count)
{
$this->worker = $count;
}

public function pcntl_call($all, \Closure $callback)
{
$count = count($all);
$perNum = ceil($count / $this->workers);

for($i = 0; $i < $this->workers; $i++){
$pids[$i] = pcntl_fork();
switch ($pids[$i]) {
case -1:
echo "fork error : {$i} \r\n";
exit;
case 0:
$start = $i * $perNum;
return $callback(array_slice($all, $start, $perNum));
exit;
default:
break;
}
}

$ret = [];
foreach ($pids as $i => $pid) {
if($pid) {
pcntl_waitpid($pid, $info);
$ret = array_merge($ret, $info);
}
}

return $ret;
}
}

и мой TestCase Вот так:

<?php

use App\Console\Commands\PcntlTrait;

class PcntlImp
{
use PcntlTrait;
}

class TestPcntlTrait extends \TestCase
{
public function setup()
{
$this->createApplication();
}

public function testPcntlCall()
{
$arr = [1,2,3,4,5,6,7,8,9,10];

$imp = new \PcntlImp();
$imp->worker(1);

$data = $imp->pcntl_call($arr, function($info){
if (empty($info)){
return [];
}

$ret = [];
foreach ($info as $item) {
$ret[] = $item * $item;
}
return $ret;
});

$this->assertCount(10, $data);
}
}

Но я могу получить ошибку:

array_merge(): Argument #2 is not an array

и я знаю, что второй аргумент функции pcntl_wait — статус, а не возвращаемые данные. Но я не знаю, как это сделать?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]