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

本文实例讲述了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程序设计有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php什么是静态类,三.PHP静态类

3.PHP静态类/******************8PHP静态类*************/class Shtml{var $Templet;var $DataSource;var $Dir;var $fileName;var $mod;var $handle;function Shtml($fileName ""){$this->fileName $fileName;$this->mod "wb";$this->handle …

php 五颗星评价,简单实现点触/输入值给五颗星评价

先上效果图gif.gif1.码UI。。。UILabel *label [[UILabel alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 30)];label.text "点击星星可以自动获取评分哦&#xff5e;";label.textColor [UIColor whiteColor];label.textAlignment NSTextAlignmentCenter;…

PHP服务器端语言是什么意思,PHP作为服务器端语言,有哪些优点?

php语言作为一门强健的服务器端语言&#xff0c;汇集多种语言优点于一身&#xff0c;为web落地页提供快速便捷的服务&#xff0c;亿速云为您详细解答php语言的相关优点。1、本地化使用其他语言编写的网站在访问者进入网站时&#xff0c;会通过语言翻译程序分析访问者的母语&…

switch语句php,PHPswitch 语句 - PHP教程

PHP switch 语句有时&#xff0c;为了避免 if 语句过于冗长&#xff0c;提高程序的可读性&#xff0c;可以使用 switch 分支控制语句。switch 语句用于根据多个不同条件执行不同动作。如果您希望有选择地执行若干代码块之一&#xff0c;请使用 switch 语句。语法switch (n){cas…

oracle1461,Oracle 10.2.0.3的ORA-1461错误

Oracle 10.2.0.3的ORA-1461错误ORA-1461 encountered when generating server alert SMG-3500经研究发现&#xff0c;其是Oracle 10g的一个Bug&#xff0c;并且目前只有Oracle 10.2.0.3会遇到&#xff1a;造成这个错误的原因是由于SMON 进程正在 UPDATE SMON_SCN_TIME表时引发了…

oracle数据库表空间如何清理,oracle数据库清理临时表空间

方法一、重启库   库重启时&#xff0c;Smon进程会完成临时段释放,TEMP表空间的清理操作&#xff0c;不过很多的时侯我们的库是不允许down的,所以这种方法缺少了一点的应用机会&#xff0c;不过这种方法还是很好用的。   法二、Metalink给出的一个方法   修改一下TEMP表空…

matlab cam orbit,Matlab的绘图函数

在Matlab的命令窗口中键入doc graph2d/graph3d/specgraph 可以获得详细的帮助graph2dTwo dimensional graphs.Elementary X-Y graphs.plot - Linear plot.loglog - Log-log scale plot.semilogx - Semi-log scale plot.semilogy - Semi-log scale plot.polar - Polar coordinat…

oracle数据库编程实验2答案,Oracle数据库-作业2-答案

第二次书面作业答案(作业在2013.5.15之前交,使用学院统一的作业封面&#xff0c;题目可以打印&#xff0c;答题内容必须手写)一、填空题1&#xff0e;PL/SQL程序块主要包括3个主要部分&#xff1a;声明部分、执行部分和理 部分。2&#xff0e;使用显式游标主要包括4个步骤&…

linux uefi无法启动文件,解决UEFI安装无法启动的问题

前言我们产品是支持UEFI安装的&#xff0c;在很多款机器上都正常的安装。今日在浪潮服务器和技嘉服务器上都遇到一次&#xff0c;可以安装&#xff0c;但是无法正常启动。所以我们必须要解决此问题&#xff0c;来支持更多的硬件。基础知识EFI的全称是&#xff0c;Extensible Fi…

如何连接Linux上的服务器 网络编程,Linux 网络编程 一

一、网络编程基础网络编程本身是一门很大的学问&#xff0c;涉及到的东西也很多&#xff0c;尤其是各种协议。先看图&#xff1a;正如上图所示&#xff0c;网络编程中包含五大层面(也有区分六个层面)&#xff0c;从应用层到物理层可以明显看出 越往下越接近计算机硬件。自己并不…

电脑练习打字软件_Type Fu for Mac 4.5.7 共享版 – 优秀的键盘打字练习软件

下载地址&#xff1a;图片中有地址系统兼容性&#xff1a;OS X 10.10或更高版本&#xff0c;64位处理器Type Fu 教您如何在不看键盘的情况下加快打字速度&#xff0c;从而提高您的打字技巧。Type Fu 功能特点&#xff1a;通用。该应用程序适合所有年龄段和技能水平。您可以是初…

access如何保存小数点后_如何把示波器当记录仪用

波形记录仪能长时间的采集信号&#xff0c;并将数据保存到设备的硬盘中&#xff0c;采集的时间长度取决于采样率以及硬盘容量&#xff0c;但和示波器相比&#xff0c;它不具备实时分析的功能&#xff0c;而这正好是示波器的强项。示波器能在长时间采集波形的同时&#xff0c;对…

linux echo 输入密码,如何在Qt中运行Linux命令时自动输入密码

之前有在Qt中运行Linux命令并且获取命令行返回值的需求&#xff0c;所以研究了一下方法由于需要获取返回的内容&#xff0c;所以用的是 QProcess::start()&#xff0c;然后用readAll()获取返回值&#xff0c;这个网上很多用法但是运行某些命令时因为权限原因需要输入密码&#…

完全相同的4个小矩形如图所示放置_分享 | 你想知道的100个桥梁知识点!

1、组合梁桥composite beam bridge指以梁式桥跨作为基本结构的组合结构桥&#xff0c;既两种以上体系重叠后&#xff0c;整体结构的反力性质仍与以受弯作用负载的梁的特点相同。这类桥的特点主要表现在设计计算工作繁重&#xff0c;构造细节及内力复杂。2、空腹拱桥open spandr…

linux bc命令全称,Linux bc 命令

Linux bc 命令bc 命令是任意精度计算器语言&#xff0c;通常在linux下当计算器用。它类似基本的计算器, 使用这个计算器可以做基本的数学运算。常用的运算&#xff1a; 加法- 减法* 乘法/ 除法^ 指数% 余数语法bc(选项)(参数)选项值-i&#xff1a;强制进入交互式模式&#xff1…

4am永远 鼠标按键设置_4AM碾压性夺冠创PCL历史!韦神赛后采访彰显霸气

《绝地求生》PCL秋季赛的战斗已经全部落下帷幕了&#xff0c;Team Razer 雷蛇战队成员&#xff0c;国内最具人气的4AM战队凭借着在季后赛的出色发挥&#xff0c;以316分的高分碾压全场&#xff0c;成功斩获本次PCL秋季赛的冠军&#xff0c;成为PCL联赛首个双冠队伍。随着金色的…

linux 敏感标记 权限,闲话Linux系统安全(二)——强制访问控制(MAC)

安全秘笈第二式——不安全的特殊权限和强制访问控制(MAC)在DAC的机制中&#xff0c;不管是所有权加权限的管理办法&#xff0c;还是文件系统访问控制列表(facl)&#xff0c;都是非常强大的访问控制机制&#xff0c;均可以对文件资源进行比较有效的访问控制。但DAC的自主性太强&…

angular项目打包_vue项目部署的最佳实践

作者&#xff1a;沉末_https://juejin.im/post/5eb2243e51882555d8457833前 言 使用vue、react、angular等技术开发过程中&#xff0c;我们都会遇到以下问题&#xff1a;首屏加载慢&#xff1b;每一次更新都需要清除浏览器缓存才能看到效果(经常被测试吐槽)。这两个问题可以从很…

run as date怎么用_熟词僻义 | date是一种什么水果?

今天小站来和各位聊聊date这个熟词。说起date&#xff0c;这可是工作生活中一个极其常用的单词。无论是为下次工作会议定个日期&#xff0c;还是为即将举行的婚礼定个日子&#xff0c;都可以用“fix/set a date for sth”来表示。在沃尔玛等超市购物&#xff0c;经常可以看到食…

linux+kill+进程和线程,在LINUX系统中 关于进程和线程终止的问题

#include#includepthread_t thread;void *fun(void *arg){printf("hell0n");pthread_exit((void * 1));}int main(void){pthread_create(&thread,NULL,fun,NULL);sleep(1);return 127;}在UNIX环境高级编程中说 进程的最后一个线程在启动例程中 执行返回语句&…