Столкнулся с многопроцессорностью при изучении сокетов в php, там есть примерно такой текст:
list($pid, $master, $workers) = $this->spawnWorkers(); //создаём дочерние процессы
if ($pid) {//мастер
fclose($server);// мастер не будет обрабатывать входящие соединения на основном сокете
//$masterclass=
$WebsocketMaster = new WebsocketMasterHandler($workers);//мастер будет пересылать сообщения между воркерами
$WebsocketMaster->start();
} else {//воркер
//$this->log("start worker with $server, $master");
$WebsocketHandler = new WebsocketWorkerHandler($server, $master);
$WebsocketHandler->start();
}
function spawnWorkers(){
$master = null;
$workers=[];
$i=0;
while ($i < $this->config['workers']) {
$i++;
//создаём парные сокеты, через них будут связываться мастер и воркер
$pair = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
$pid = pcntl_fork();//создаём форк
if ($pid == -1) {
die("error: pcntl_fork\r\n");
} elseif ($pid) { //мастер
//$this->log('i will be master');
fclose($pair[0]);
$workers[$pid] = $pair[1];//один из пары будет в мастере
} else { //воркер
//$this->log('i will be slave');
fclose($pair[1]);
$master = $pair[0];//второй в воркере
break;
}
}
if(!$this->config['workers']){
$pair = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
list($pid, $master, $workers) = [0,$pair[0],[$pair[1]]];
}
return array($pid, $master, $workers);
}
Родитель создаёт ($this->config['workers']) воркеров и общается с ними данными, запакованными json через созданные сокеты, переданные в контроллеры мастера и воркеров через $workers и $master соответственно, а $server создаётся до приведённого кода через stream_socket_server - это коннект, который слушают все воркеры и принимают через него клиентские соединения... сама статья тут