引入背景:假如我们每天有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
# PHP swoole中使用task进程异步的处理耗时任务应用案例分析
# php swoole多进程/多线程用法示例【基于php7nts版】
# PHP基于swoole多进程操作示例
# PHP swoole中http_server的配置与使用方法实例分析
# PHP使用swoole编写简单的echo服务器示例
# php安装swoole扩展的方法
# php异步多线程swoole用法实例
# PHP的swoole扩展安装方法详细教程
# 使用swoole扩展php websocket示例
# PHP框架Swoole定时器Timer特性分析
# PHP+swoole实现简单多人在线聊天群发
# PHP swoole的process模块创建和使用子进程操作示例
# 拉起
# 都是
# 不需要
# 太大
# 如果没有
# 中去
# 后会
# 数据库中
# 大家多多
# 数据交换
# 使用了
# uid
# function
# bot
# uname
# gt
# public
相关文章:
香港服务器网站卡顿?如何解决网络延迟与负载问题?
宁波自助建站系统如何快速打造专业企业网站?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
如何选择高效响应式自助建站源码系统?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
ui设计制作网站有哪些,手机UI设计网址吗?
Python文件管理规范_工程实践说明【指导】
建站之星安全性能如何?防护体系能否抵御黑客入侵?
如何快速搭建高效WAP手机网站?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
网站按钮制作软件,如何实现网页中按钮的自动点击?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
定制建站方案优化指南:企业官网开发与建站费用解析
制作网站的软件免费下载,免费制作app哪个平台好?
建站之星多图banner生成与模板自定义指南
北京网站制作网页,网站升级改版需要多久?
英语简历制作免费网站推荐,如何将简历翻译成英文?
无锡营销型网站制作公司,无锡网选车牌流程?
建站之星与建站宝盒如何选择最佳方案?
建站之星如何防范黑客攻击与数据泄露?
如何快速搭建支持数据库操作的智能建站平台?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
建站主机选择指南:服务器配置与SEO优化实战技巧
沈阳制作网站公司排名,沈阳装饰协会官方网站?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
如何选择香港主机高效搭建外贸独立站?
如何通过虚拟主机空间快速建站?
北京制作网站的公司,北京铁路集团官方网站?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
建站之星收费标准详解:套餐费用及年费价格表一览
如何在橙子建站上传落地页?操作指南详解
建站主机默认首页配置指南:核心功能与访问路径优化
建站之星后台管理如何实现高效配置?
广平建站公司哪家专业可靠?如何选择?
手机网站制作与建设方案,手机网站如何建设?
已有域名和空间如何快速搭建网站?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
如何在万网自助建站平台快速创建网站?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
江苏网站制作公司有哪些,江苏书法考级官方网站?
如何使用Golang安装API文档生成工具_快速生成接口文档
网站制作报价单模板图片,小松挖机官方网站报价?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
建站之星客服服务时间及联系方式如何?
如何用美橙互联一键搭建多站合一网站?
如何零基础开发自助建站系统?完整教程解析
*请认真填写需求信息,我们会在24小时内与您取得联系。