swoole 父子进程间通信

Posted cshaptx4869

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swoole 父子进程间通信相关的知识,希望对你有一定的参考价值。

 

<?php
/**
 * 场景:
 * 监控订单表状态 父子进程通信
 * 一个主进程 两个子进程实现
 */

//设置主进程名
echo ‘主进程id:‘ . posix_getpid() . PHP_EOL;
cli_set_process_title(‘php_main‘);

//1、此子进程用于监听数据的改变
$process1 = new SwooleProcess(function (SwooleProcess $process) {
//    cli_set_process_title(‘php_child‘);
    $process->name(‘php_child1‘);
    $pdo = new PDO(‘mysql:host=mysql;dbname=test‘, ‘root‘, ‘root‘);

    while (true) {
        $statement = $pdo->query(‘select * from `order` where is_pay=1 and is_notice=0 order by id desc‘);
        $data = $statement->fetch(PDO::FETCH_ASSOC);
        if ($data) {
            //向主进程发送消息
            $process->write(‘php_child1发送‘ . $data[‘client_name‘] . ‘已支付 ‘);
            $pdo->exec(‘update `order` set is_notice=1 where id=‘ . $data[‘id‘]);
        }
        sleep(3);
    }
}, false, SOCK_STREAM, true);
echo ‘子进程1 id:‘ . $process1->start() . PHP_EOL;

//2、此子进程用于发送邮件
$process2 = new SwooleProcess(function (SwooleProcess $process) {
    $process->name(‘php_child2‘);
    while (true) {
        $orderInfo = $process->read();
        if ($orderInfo) {
            echo $orderInfo;
            echo ‘php_child2发送邮件‘ . PHP_EOL;
        }
        sleep(3);
    }
}, false, SOCK_STREAM, true);
echo ‘子进程2 id:‘ . $process2->start() . PHP_EOL;


while (true) {
    //主进程读取子进程1中的消息
    $orderInfo = $process1->read();
    if ($orderInfo) {
        //主进程发送数据给子进程2
        $process2->write($orderInfo);
    }
    sleep(3);
}

//SwooleProcess::wait();
//使用Process作为监控父进程,创建管理子进程时,父类必须注册信号SIGCHLD对退出的进程执行wait,否则子进程退出时会变成僵尸进程
SwooleProcess::signal(SIGTERM, function ($signo) {
    echo "shutdown.";
});

 

 

以上是关于swoole 父子进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

Swoole系列3.4进程间通信

swoole管道通信

Swoole系列4.4协程间通信Channel及WithGroup

swoole使用异步进程通信

Linux进程间通信-命名管道

Linux_Centos进程间通信_管道(匿名管道_命名管道)