全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解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  # 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小时内与您取得联系。