本文实例讲述了PHP swoole的process模块创建和使用子进程操作。分享给大家供大家参考,具体如下:

swoole中为我们提供了一个进程管理模块 Process,替换PHP的 pcntl 扩展,方便我们创建进程,管理进程,和进程间的通信。

swoole提供了2种进程间的通信:

1、基于 unix socket 的管道 pipe。

2、基于 sysvmsg 的消息队列。

我们可以通过 new swoole_process() 快速的创建一个进程,默认会创建一个 SOCK_DGRAM 类型的管道,用于进程间的通信,当然可以设置成其他类型,也可以不创建。

一、通过同步阻塞管道进行进程间通信

$worker_process_nums = 5;

$worker_process = [];

for ($i = 0; $i < $worker_process_nums; $i++) {

//创建子进程

//默认为每个子进程创建一个管道,如果不想创建设置$pipe_type参数为false

//注意管道默认是同步阻塞,半双工,如果读取不到数据就会阻塞

$worker = new swoole_process(function (swoole_process $worker) {

//注意,如果主进程中不写数据write(),那么子进程这里read()就会阻塞

$task = json_decode($worker->read(), true);

//进行计算任务

$tmp = 0;

for ($i = $task['start']; $i < $task['end']; $i++) {

$tmp += $i;

}

echo '子进程 PID : ', $worker->pid, ' 计算 ', $task['start'], ' - ', $task['end'], ' 结果 : ', $tmp, PHP_EOL;

//往管道中写入计算的结果

$worker->write($tmp);

//子进程退出

$worker->exit();

});

//保存子进程

$worker_process[$i] = $worker;

//启动子进程

$worker->start();

}

//往每个子进程管道中投递任务

for ($i = 0; $i < $worker_process_nums; $i++) {

$worker_process[$i]->write(json_encode([

'start' => mt_rand(1, 10),

'end' => mt_rand(50, 100),

]));

}

//父进程监听子进程退出信号,回收子进程,防止出现僵尸进程

swoole_process::signal(SIGCHLD, function ($sig) {

//必须为false,非阻塞模式

while ($ret = swoole_process::wait(false)) {

echo "子进程 PID : {$ret['pid']} 退出\n";

}

});

二、通过 swoole_event_add 将管道设为异步,来进行通信

$worker_process_nums = 5;

$worker_process = [];

for ($i = 0; $i < $worker_process_nums; $i++) {

$worker = new swoole_process(function ($worker) {

//在子进程中给管道添加事件监听

//底层会自动将该管道设置为非阻塞模式

//参数二,是可读事件回调函数,表示管道可以读了

swoole_event_add($worker->pipe, function ($pipe) use ($worker) {

$task = json_decode($worker->read(), true);

$tmp = 0;

for ($i = $task['start']; $i < $task['end']; $i++) {

$tmp += $i;

}

echo "子进程 : {$worker->pid} 计算 {$task['start']} - {$task['end']} \n";

//子进程把计算的结果,写入管道

$worker->write($tmp);

//注意,swoole_event_add与swoole_event_del要成对使用

swoole_event_del($worker->pipe);

//退出子进程

$worker->exit();

});

});

$worker_process[$i] = $worker;

//启动子进程

$worker->start();

}

for ($i = 0; $i < $worker_process_nums; $i++) {

$worker = $worker_process[$i];

$worker->write(json_encode([

'start' => mt_rand(1, 10),

'end' => mt_rand(50, 100),

]));

//主进程中,监听子进程管道事件

swoole_event_add($worker->pipe, function ($pipe) use ($worker) {

$result = $worker->read();

echo "子进程 : {$worker->pid} 计算结果 {$result} \n";

swoole_event_del($worker->pipe);

});

}

//父进程监听子进程退出信号,回收子进程,防止出现僵尸进程

swoole_process::signal(SIGCHLD, function ($sig) {

//必须为false,非阻塞模式

while ($ret = swoole_process::wait(false)) {

echo "子进程 PID : {$ret['pid']} 退出\n";

}

});

三、使用消息队列来完成进程间通信

$worker_process_nums = 5;

$worker_process = [];

for ($i = 0; $i < $worker_process_nums; $i++) {

//注意,这里将参数$pipe_type设为false,表示不创建管道

$worker = new swoole_process(function ($worker) {

$task = json_decode($worker->pop(), true);

$tmp = 0;

for ($i = $task['start']; $i < $task['end']; $i++) {

$tmp += $i;

}

echo "子进程 : {$worker->pid} 计算 {$task['start']} - {$task['end']} \n";

$worker->push($tmp);

$worker->exit();

}, false, false);

//使用消息队列,作为进程间的通信

//注意,消息队列是共享的

$worker->useQueue();

$worker_process[$i] = $worker;

//启动子进程

$worker->start();

}

for ($i = 0; $i < $worker_process_nums; $i++) {

//只需用一个子进程发送消息即可,因为消息队列是共享的

$worker_process[0]->push(json_encode([

'start' => mt_rand(1, 10),

'end' => mt_rand(50, 100),

]));

}

//注意,这里要暂停,防止加入队列的任务,立刻被主进程读出来。

sleep(1);

for ($i = 0; $i < $worker_process_nums; $i++) {

$result = $worker_process[0]->pop();

echo "计算结果 : {$result} \n";

}

//父进程监听子进程退出信号,回收子进程,防止出现僵尸进程

swoole_process::signal(SIGCHLD, function ($sig) {

//必须为false,非阻塞模式

while ($ret = swoole_process::wait(false)) {

echo "子进程 PID : {$ret['pid']} 退出\n";

}

});

四、进程可以通过 signal 监听信号,和 alarm 设置定时器。

我们可以在父进程上设置监听信号,当子进程退出时,重新挂起子进程。

也可以设置定时器,通过 swoole_process::kill($pid, 0); 定时检测进程是否存活。

//每隔1秒触发SIGALAM信号

//注意,alarm不能和Timer同时使用

swoole_process::alarm(1000 * 1000, 0);

swoole_process::signal(SIGALRM, function ($signo) {

static $cnt = 0;

$cnt++;

echo "时钟定时信号\n";

if ($cnt > 10) {

//清除定时器

swoole_process::alarm(-1);

}

});

swoole_process::signal(SIGINT, function ($signo) {

echo "我被ctrl+c了\n";

//退出主进程,不然将一直无法正常退出

exit(0);

});

希望本文所述对大家PHP程序设计有所帮助。

php swoole process,PHP swoole的process模块创建和使用子进程操作示例相关推荐

  1. wxpython frame鼠标拖动_Python wxpython模块响应鼠标拖动事件操作示例

    本文实例讲述了Python wxpython模块响应鼠标拖动事件操作.分享给大家供大家参考,具体如下: wxpython鼠标拖动事件小案例: #coding:UTF-8 import wx app = ...

  2. python鼠标拖拽功能_Python wxpython模块响应鼠标拖动事件操作示例

    本文实例讲述了Python wxpython模块响应鼠标拖动事件操作.分享给大家供大家参考,具体如下: wxpython鼠标拖动事件小案例: #coding:UTF-8 import wx app = ...

  3. swoole的process模块创建和使用子进程

    swoole中为我们提供了一个进程管理模块 Process,替换PHP的 pcntl 扩展,方便我们创建进程,管理进程,和进程间的通信. swoole提供了2种进程间的通信: 1.基于 unix so ...

  4. php进程间通信 yoc_swoole的process模块创建和使用子进程

    swoole中为我们提供了一个进程管理模块 Process,替换PHP的 pcntl 扩展,方便我们创建进程,管理进程,和进程间的通信. swoole提供了2种进程间的通信: 1.基于 unix so ...

  5. laravel swoole mysql_Laravel集成Swoole教程

    1.准备工作 安装 Laravel laravel new laravel-swoole 本人使用 valet 进行开发,可以使用 laravel-swoole.test 进行访问 2.引入 swoo ...

  6. swoole client php,Swoole Client

    PHP常用socket创建TCP连接,使用CURL创建HTTP连接,为了简化操作,Swoole提供了Client类用于实现客户端功能,并增加了异步非阻塞模式,让用户在客户端也能使用事件循环. 作为客户 ...

  7. php swoole编译,php+swoole+redis源码编译安装

    tar -zxvf php-7.2.4.tar.gz cd php-7.2.4 ./configure --prefix=/usr/local/php make && make ins ...

  8. php 游戏开发swoole,《基于 Swoole 的对战游戏实践》开课啦

    项目由来 在三月份的时候就开始编写这个项目,原本只是觉得自己对 Swoole 不太熟练,当作练手来写着玩的.写着写着发现还挺好玩的,代码量也不多,捉迷藏游戏的趣味性不错. 如果只写完代码就扔在 Git ...

  9. ORACLE process爆满,大量process没有对应的session

    ORACLE process爆满,大量process没有对应的session 问题现象 oracle process爆满,session会话数只有100多个,执行以下SQL,发现有几千个进程没有对应的 ...

最新文章

  1. SAP销售发票同步产生会计凭证的两种做法
  2. D. Best Edge Weight(最小生成树 + 树链剖分)(Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals))
  3. JavaScript中错误正确处理方式,你用对了吗? 1
  4. 马斯克称面临巨大通胀压力 暗示特斯拉可能涨价
  5. 年轻人逃离推荐算法围城:老年版App,用着真香
  6. Xtrabackup远程备份+限速
  7. Java写一个app控制电机_java控制步进电机
  8. IIS 发布的FTP提供下载时的转码问题
  9. Java语言编写一个简单彩票机的程序
  10. 论坛源码推荐(12月24日):OS X原生开源游戏模拟器OpenEmu iOS 7条形码扫描器
  11. Matlab取整函数之Floor\fix\round\ceil取余函数rem\mod
  12. mysql stmt attr set_mysqli_stmt::attr_set()
  13. win7系统备份还原软件_比ghost快200%!备份还原系统真正首选的神器
  14. Grafana的短信报警
  15. 4399怎么修复游戏服务器,[ 服务器 ]4399官方服务器(改ip了)
  16. Codeforces 1155F Delivery Oligopoly dp(看题解)
  17. 微信程序开发小程序交互
  18. 全球及中国板材制造行业销售前景与产销规模分析报告2022-2028年
  19. 复杂网络中节点重要性方面的研究热点问题
  20. 阅读笔记 |《科学史和科学哲学导论》舒斯特

热门文章

  1. Office2010试用
  2. java 容器都有哪些?_适合存储普洱茶的容器都有哪些?
  3. python调用菜单响应事件_[Python] wxpython 编程触发菜单或按钮事件
  4. [转载] Java中的字符串处理
  5. scala中循环守卫_Scala中的循环
  6. Python字典values()方法与示例
  7. puppeteer api_使用Node.js和puppeteer API从URL创建PDF文件
  8. lvs负载均衡—DR模式
  9. python 散点图 分类_Python | 分类图
  10. Scala程序将字符串转换为整数