PHP swoole process的使用
引入背景:假如我们每天有10000个订单生成,需要同步到仓储系统中去,以前做法是开启一个crontab去跑这些任务,但是发现总有感觉同步效率低,间隔时间都是分钟级别的。
解决方案测试:我们将同步订单的任务表添加一个hash作为key,作为分发条件,因为mysql中select如果做mod函数是用不到索引的,所以我们自己做随机hash,但是务必不需要范围太大,以免服务器资源不够,方法是根据hashkey投放到不同的进程中进行同步,测试代码如下
<?php
/**
* Created by PhpStorm.
* User: xujun
* Date: 2017/8/26
* Time: 9:37
*/
//假定需要处理的数据如下
class Process{
public $mpid=0;
public $max_precess=5;
//代替从数据库中读取的内容
public $task = [
['uid'=>1,'uname'=>'bot','hash'=>1,'handle'=>'test'],
['uid'=>2,'uname'=>'bot1','hash'=>2,'handle'=>'test'],
['uid'=>3,'uname'=>'bot2','hash'=>3,'handle'=>'test'],
['uid'=>4,'uname'=>'bot3','hash'=>4,'handle'=>'test'],
['uid'=>2,'uname'=>'bot4','hash'=>2,'handle'=>'test'],
['uid'=>3,'uname'=>'bot5','hash'=>3,'handle'=>'test'],
['uid'=>4,'uname'=>'bot6','hash'=>1,'handle'=>'test'],
];
public $works = [];
public $swoole_table = NULL;
//public $new_index=0;
function test($index,$task){
print_r("[".date('Y-m-d H:i:s')."]".'work-index:'.$index.'处理'.$task['uname'].'完成'.PHP_EOL);
} public function __construct(){
try {
$this->swoole_table = new swoole_table(1024);
$this->swoole_table->column('index', swoole_table::TYPE_INT);//用于父子进程间数据交换
$this->swoole_table->create(); swoole_set_process_name(sprintf('php-ps:%s', 'master'));
$this->mpid = posix_getpid();
$this->run();
$this->processWait();
}catch (\Exception $e){
die('ALL ERROR: '.$e->getMessage());
}
} public function run(){
for ($i=0; $i < $this->max_precess; $i++) {
$this->CreateProcess();
}
} private function getTask($index){
$_return = [];
foreach ($this->task as $v){
if($v['hash']==$index){
$_return[] = $v;
}
}
return $_return;
} public function CreateProcess($index=null){
if(is_null($index)){//如果没有指定了索引,新建的子进程,开启计数
$index=$this->swoole_table->get('index');
if($index === false){
$index = 0;
}else{
$index = $index['index']+1;
}
print_r($index);
}
$this->swoole_table->set('index',array('index'=>$index));
$process = new swoole_process(function(swoole_process $worker)use($index){ swoole_set_process_name(sprintf('php-ps:%s',$index));
$task = $this->getTask($index);
foreach ($task as $v){
call_user_func_array(array($this,$v['handle']),array($index,$v));
}
sleep(20);
}, false, false);
$pid=$process->start(); $this->works[$index]=$pid;
return $pid;
} public function rebootProcess($ret){
$pid=$ret['pid'];
$index=array_search($pid, $this->works);
if($index!==false){
$index=intval($index);
$new_pid=$this->CreateProcess($index);
echo "rebootProcess: {$index}={$new_pid} Done\n";
return;
}
throw new \Exception('rebootProcess Error: no pid');
} public function processWait(){
while(1) {
if(count($this->works)){
$ret = swoole_process::wait();
if ($ret) {
$this->rebootProcess($ret);
}
}else{
break;
}
}
} }
$process = new Process();
这里代码中,使用了swoole_table作为进程间共享的内存,为了分配index。以及当进程退出后,父进程通过wait重新拉起该进程任务。
测试截图
进程ps

结果 休眠20s后退出后会被自动拉起

PHP swoole process的使用的更多相关文章
- swoole深入学习 4. process
swoole-1.7.2增加了一个进程管理模块,用来替代PHP的pcntl扩展.pcntl是php新增的一个多进程扩展,用来实现多进程,但是有很多不完善的地方,swoole 就完善了这些地方,而且使得 ...
- Swoole 进程管理模块 Process 之单进程的使用
PHP 自带的 pcntl,存在很多不足,如: 没有提供进程间通信的功能: 不支持重定向标准输入和输出: 只提供了 fork 这样原始的接口,容易使用错误: Swoole\Process 提供了如下特 ...
- 【swoole】如果使用好定时器功能
swoole中提供了一个定期器的用法 $server->tick(1000, function() use ($server, $fd) { $server->send($fd, &quo ...
- 安装使用swoole
swoole首页:https://www.swoole.com/ 方法1:使用pecl安装 pecl install swoole 注意,php版本必须是7.0以及7.0以上的版本. 方法2:编译源码 ...
- swoole创建工作进程,执行滞后工作
一,创建守候进程,因为这里不需要Server,也没有Client,数据交换通过redis进行 <?php namespace Kuba\Saas; require_once __DIR__ . ...
- swoole 连接池
proxy_pool.php <?php class ProxyServer { protected $frontends; protected $backends; /** * @var sw ...
- LaravelS - 基于Swoole加速Laravel/Lumen
LaravelS LaravelS是一个胶水项目,用于快速集成Swoole到Laravel或Lumen,然后赋予它们更好的性能.更多可能性.Github 特性 内置Http/WebSocket服务器 ...
- swoole 监控文件改动
<?php /** * 场景: * 进程监控文件改动 */ date_default_timezone_set('PRC'); echo '进程id:' . posix_getpid() . P ...
- swoole 消息队列
<?php /** * 场景: * 监控订单表状态 队列通信 * 一个进程向队列发布消息 另外两个进程争抢 */ //设置主进程名 echo '主进程id:' . posix_getpid() ...
随机推荐
- webservice调用dll
今天客户那里报出来,ws通讯不成功.但是在本机和windows2003上都可以测试成功.WS的页面(asmx)可以出来,但是点击接口方法,调用就报http500错误. 网站无法显示该页面 HTT ...
- VMwear安装Centos7超详细过程
本篇文章主要介绍了VMware安装Centos7超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.软硬件准备 软件:推荐使用VMwear,我用的是VMwear 12 镜像:Ce ...
- 常见异常代码oracle
exception oracle error sqlcode value condition no_data_found ora-01403 +100 select into 语句没有符合条件的记录返 ...
- Java用代码演示String类中的以下方法的用法
用代码演示String类中的以下方法的用法 (1)boolean isEmpty(): 判断字符串是不是空串,如果是空的就返回true (2)char charAt(int index): 返回索引上 ...
- Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)
一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同 ...
- linux 根据服务名称批量杀死进程
ps -ef |grep python |awk '{print $2}'|xargs kill -9
- 六、Prototype 原型设计模式
需求:使用 new 生成实例需要指定类名,在不指定类的情况下生成实例 代码清单: 原型接口 Product: public interface Product extends Cloneable{ v ...
- laravel 5.1部署到 集成环境 lnmp上
laravel 5.1 需要配置:php版本 >= 5.5.9 如果php版本不够可以升级 1.切换到安装包目录 # cd /lnmp1.3-full 2.升级php命令 # ./upgrade ...
- PHP实现curl和snoopy类模拟登陆方法
Snoopy.class.php下载 方法/步骤 第一种:使用snoopy类实现模拟登陆 1.在网上下载一个Snoopy.class.php的文件 2.代码实现: <?php set_t ...
- 第十一章 串 (c2)KMP算法:查询表