<?php
/**
* 场景:
* 监控订单表状态 队列通信
* 一个进程向队列发布消息 另外两个进程争抢
*/ //设置主进程名
echo '主进程id:' . posix_getpid() . PHP_EOL;
cli_set_process_title('php_main'); //1、此子进程用于监听数据的改变
$process1 = new \Swoole\Process(function (\Swoole\Process $process) {
// cli_set_process_title('php_child');
$process->name('php_child1');
$pdo = new \PDO('mysql:host=mysql;dbname=test', 'root', 'csh.aptx4869#'); 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->push('php_child1发送' . $data['client_name'] . '已支付 ');
$pdo->exec('update `order` set is_notice=1 where id=' . $data['id']);
}
sleep(3);
}
}, false, SOCK_STREAM, true);
//启动消息队列作为进程间通信
$process1->useQueue(2);
echo '子进程1 id:' . $process1->start() . PHP_EOL; //2、此子进程用于发送邮件
$process2 = new \Swoole\Process(function (\Swoole\Process $process) {
$process->name('php_child2');
while (true) {
//从队列中提取数据
$orderInfo = $process->pop();
if ($orderInfo) {
echo $orderInfo;
echo 'php_child2发送邮件' . PHP_EOL;
}
sleep(3);
}
}, false, SOCK_STREAM, true);
$process2->useQueue(2);
echo '子进程2 id:' . $process2->start() . PHP_EOL; //3、此子进程用于发送邮件
$process3 = new \Swoole\Process(function (\Swoole\Process $process) {
$process->name('php_child3');
while (true) {
//从队列中提取数据
$orderInfo = $process->pop();
if ($orderInfo) {
echo $orderInfo;
echo 'php_child3发送邮件' . PHP_EOL;
}
sleep(3);
}
}, false, SOCK_STREAM, true);
$process3->useQueue(2);
echo '子进程3 id:' . $process3->start() . PHP_EOL; while (true) {
sleep(3);
} //\Swoole\Process::wait();
//使用Process作为监控父进程,创建管理子进程时,父类必须注册信号SIGCHLD对退出的进程执行wait,否则子进程退出时会变成僵尸进程
Swoole\Process::signal(SIGCHLD, function ($signo) {
//false 非阻塞模式
while ($ret = \Swoole\Process::wait(false)) {
var_dump($ret);
}
});

最新文章

  1. CRL快速开发框架系列教程十(导出对象结构)
  2. [Winform] DataGridView 总结(FAQ)
  3. 53. Maximum Subarray
  4. git学习系列--六分之一
  5. dos下循环复制一张图片的bat
  6. DropBox为什么一直那么红——靠用户体验,旗帜鲜明,它要保存的是你的重要随身资料,并且开放API
  7. Unity3DGUI:常用控件
  8. selenium及webdriver的原理
  9. Servlet_note
  10. MongoDB:配置与安装
  11. Webform——JQuery基础(选择器、事件、DOM操作)
  12. 更改oracle数据库密码(因为密码过期)
  13. 安装连接mysql8时候遇到的问题以及解决(转)
  14. dede调用多级导航的方法
  15. HTTP、TCP、UDP以及SOCKET
  16. 新建linux服务器初始化操作
  17. vscode调试js,安装了nodejs之后还出现无法在Path上找到运行时的node
  18. SCSI Pass-Through Interface Tool
  19. Dive into Spring framework -- 了解基本原理(二)--设计模式-part1
  20. Spark性能优化--开发调优与资源调优

热门文章

  1. Java经典面试笔试题及答案
  2. phpinfo(): It is not safe to rely on the system&#39;s timezone settings
  3. 关于XMlHttpRequest对象
  4. 【转载】巴塞尔问题(Basel Problem)的多种解法
  5. java使用bitmap求两个数组的交集
  6. 「NOI2016」区间
  7. Python web在IIS上发布方法和原理
  8. vb.net从数据库中取数据
  9. vs的一些操作技巧:在写代码时自动换行的设置
  10. 连接数据库的url