-
【多进程】php实现 master-worker 守护多进程模式
<?php class Worker{ public static $count = 2; public static function runAll(){ static::runMaster(); static::moniProcess(); } //开启主进程 public static function runMaster(){ //确保进程有最大操作权限 unmask(0); $pid = pcntl_fork(); if($pid > 0){ echo "主进程进程 $pid \n"; exit; }else if($pid == 0){ if(-1 === posix_setsid()){ throw new Exception("setsid fail"); } for ($i=0; $i < self::$count; $i++) { static::runWorker(); } @cli_set_process_title("master_process"); }else{ throw new Exception("创建主进程失败"); } } //开启子进程 public static function runWorker(){ unmask(0); $pid = pcntl_fork(); if($pid > 0){ // echo "创建子进程 $pid \n"; }else if($pid == 0){ if(-1 === posix_setsid()){ throw new Exception("setsid fail"); } @cli_set_process_title("worker_process"); while(1){ sleep(1); } }else{ throw new Exception("创建子进程失败"); } } //监控worker进程 public function moniProcess(){ while( $pid = pcntl_wait($status)){ if($pid == -1){ break; }else{ static::runWorker(); } } } } Worker::runAll();
ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 18200 3076 pts/0 Ss+ 14:05 0:00 bash root 6 0.0 0.0 18208 3252 pts/1 Ss 14:06 0:00 bash root 19 0.0 0.0 18204 3248 pts/2 Ss+ 14:11 0:00 bash root 64 0.0 0.2 348488 8320 ? Ss 15:32 0:00 master_process root 65 0.0 0.2 348488 8400 ? Ss 15:32 0:00 worker_process root 66 0.0 0.2 348488 8400 ? Ss 15:32 0:00 worker_process root 67 0.0 0.0 36640 2804 pts/1 R+ 15:32 0:00 ps -aux
执行命令 kill 65,杀死进程 65 则master_process 进程会再自动开启一个子进程
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 18200 3076 pts/0 Ss+ 14:05 0:00 bash root 6 0.0 0.0 18208 3252 pts/1 Ss 14:06 0:00 bash root 19 0.0 0.0 18204 3248 pts/2 Ss+ 14:11 0:00 bash root 64 0.0 0.2 348488 8320 ? Ss 15:32 0:00 master_process root 66 0.0 0.2 348488 8400 ? Ss 15:32 0:00 worker_process root 68 0.0 0.1 348488 5796 ? Ss 15:34 0:00 worker_process root 69 0.0 0.0 36640 2728 pts/1 R+ 15:34 0:00 ps -aux
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式