Автор оригинала: David Wong.
Не болтай много, переходи прямо к коду
Созданные подпроцессы:
public function __construct()
{
$this - > redis = container:: get (swooleredis:: class); // get asynchronous redis for higher performance
$this->process = new swoole_process(function (swoole_process $process) {
return $this->process($process);
}, false, SOCK_DGRAM);
$this->process->name('Test_Gateway');
$this->process->useQueue();
$this - > process - > start(); // start sub process
}
/**
*Subprocess processing logic
* @param swoole_process $process
*/
private function process(swoole_process $process)
{
$client = new spool u client (spool u sock u TCP, spool u sock u async); // asynchronous non blocking
$client->on("connect", function (swoole_client $cli) use ($process) {
$process->write('connected');
});
$client->on("receive", function (swoole_client $cli, $data) use ($process) {
$process->write($data);
});
$client->on("error", function (swoole_client $cli) use ($process) {
$process->write('error');
});
$client->on("close", function (swoole_client $cli) use ($process) {
$process->write('close');
});
if ($client->connect('127.0.0.1', 90, -1)) {
} else {
$process - > write ('gateway connection failed ');
}
swoole_event_add($process->pipe,
Function ($pipe) use ($process, $client) {// read the parent process pipeline message
$client->send($process->read());
});
}Родительский процесс при запуске рабочего:
/**
* @param swoole_server $serv
* @param $worker_id
*/
public function onWorkerStart(\swoole_server $serv, $worker_id)
{
if ($worker_id === 0) {
swoole_timer_tick(1000, function () {
$this->process->write('ping');
});
$process = $this->process;
swoole_event_add($process->pipe,
Function ($pipe) use ($process) {// get the pipe message of the subprocess
Echo "subprocess message:" $process - > read(). Php_eol;
});
}
}- Клиент Клиент подпроцесса может быть проигнорирован. Эта демонстрация-всего лишь пример того, как скрыть связь по трубопроводу
- Очереди сообщений нельзя использовать с каналами: $process_push() и $process – > pop();
- Теоретически регистрация цикла событий в каждом родительско-дочернем процессе может реализовывать отправку и получение сообщений одновременно
- Другие последующие дополнения
Оригинал: “https://developpaper.com/swoole-process-parent-child-process-pipeline-communication-case/”