PHP的多进程模型-fork实现
来源:互联网 发布:mac安装aptget 编辑:程序博客网 时间:2024/05/23 21:57
在工作中,经常会用到将一大批数据分到多个进程中去处理的需求。于是自己写了一个简单的多进程类。方便以后使用,特在此总结一下:
初始化一个多进程模型:$processes = new Processes($processNumber);
$processNumber表示启动几个进程。
用多进程模型来运行指定的方法:$processes->run($object, $method, $data, $recall)
$object: 要运行的方法所处的对象
$method:要运行的对象的方法
$data:要处理的数据,必须为一个数组
$recall:回调的方法
注:此类库模型仅在Linux平台下可用。且安装php时必须--enable-pcntl。即已安装pcntl模块。
例如:我们要对0-100个数都做加1操作,我们启动五个进程,则有如下代码:
class Add { public function run() { $data = array(); for ($i = 0; $i <= 10; $i++) { $data[] = $i; } $processes = new Processes(5); $processes->run($this, 'add', $data); } public function add($data) { foreach ($data as $row) { echo ($row+1).PHP_EOL; } }}$add = new Add();$add->run();
附:多进程模型类代码:
class Processes{ /** * 进程的个数 * * @var intval */ protected $_number; /** * 已启动的进程个数 * * @var intval */ protected $_forkedNumber; /** * 最大进程个数 * * @var intval */ protected $_maxNumber; /** * 进程id列表 * * @var array */ protected $_pids; /** * 初始化 * * @param intval $maxNumber * @return void */ public function __construct($maxNumber) { if ($maxNumber <= 1) { throw new Exception('The num must above one'); } $this->_forkedNumber = 0; $this->_number = 0; $this->_maxNumber = $maxNumber; } /** * 获取进程的个数 * * @return intval */ public function getNumber() { return $this->_number; } /** * 获取进程的个数 * * @return intval */ public function getForkedNumber() { return $this->_forkedNumber; } /** * 获取最大进程的个数 * * @return intval */ public function getMaxNumber() { return $this->_maxNumber; } /** * 设置最大进程个数 * * @return intval */ public function setMaxNumber($number) { $this->_maxNumber = $number; } /** * 是否满了 * * @return void */ public function isFull() { return $this->getForkedNumber() >= $this->getMaxNumber(); } /** * 开始工作 * * @param object $model * @param string $command * @param array $data * @param string $recall * @return void */ public function run($model, $command, $data = array(), $recall = null) { if (!empty($data)) { $data = array_chunk($data, ceil(count($data)/$this->getMaxNumber()), true); $this->setMaxNumber(count($data)); } for ($i = 0; $i < $this->getMaxNumber(); $i++) { $pid = pcntl_fork(); if ($pid < 0) { return false; } elseif ($pid == 0) { $model->$command($data[$i]); exit(0); } else { $this->_pids[$pid] = true; $this->_number++; $this->_forkedNumber++; } } if ($this->isFull()) { $this->wait(); if ($recall) { $model->$recall(); } exit(0); } } /** * 等候子进程运行完程序 * * @return void */ public function wait() { $finNumber = 0; $errNumber = 0; while (true) { $pid = pcntl_waitpid(-1, $state, WNOHANG|WUNTRACED); if ($pid <= 0) { usleep(100); continue; } $finNumber++; $this->_number--; if ($this->_number <= 0) { return true; } usleep(100); } }}
- PHP的多进程模型-fork实现
- php通过fork和管道实现多进程
- 聊聊Linux fork多进程并发服务器模型
- GDB调试多进程的fork+exec
- fork进程的过程
- 守护进程的实现以及fork两次的原因
- fork,waitpid实现守护进程
- C语言里的多进程(用fork函数实现)
- 多进程总结-fork
- python fork()多进程
- 多进程fork
- fork 多进程调试
- perl fork多进程
- fork创建多进程
- C++ fork多进程
- Linux多进程-fork()
- php多进程实现
- php多进程实现
- 公司日常系统基本管理
- 快速查询
- AIX rootvg 镜像创建与磁盘更换
- IOS:定义自己的Log函数
- Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager
- PHP的多进程模型-fork实现
- 银行业务模拟
- 给WordPress后台文章列表增加自定义排序栏
- Javascript闭包——懂不懂由你,反正我是懂了
- android零碎知识点
- SQL Server死锁总结
- Android适配多分辨率注意事项
- C3PO数据源简介
- Postgresql简单的导入导出