详解PHP swoole process的使用方法


Posted in PHP onAugust 26, 2017

引入背景:假如我们每天有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

详解PHP swoole process的使用方法

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

详解PHP swoole process的使用方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
ajax缓存问题解决途径
Dec 06 PHP
彻底杜绝PHP的session cookie错误
Aug 09 PHP
php中session_unset与session_destroy的区别分析
Jun 16 PHP
php中使用explode查找某个字符是否存在的方法
Jul 12 PHP
MySQL的FIND_IN_SET函数使用方法分享
Mar 27 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
Nov 12 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
Aug 25 PHP
php返回json数据函数实例
Oct 09 PHP
PHP开启opcache提升代码性能
Apr 26 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
Dec 21 PHP
Yii框架Session与Cookie使用方法示例
Oct 14 PHP
Laravel 实现添加多语言提示信息
Oct 25 PHP
Yii2框架可逆加密简单实现方法
Aug 25 #PHP
PHP5.6新增加的可变函数参数用法分析
Aug 25 #PHP
php变量与JS变量实现不通过跳转直接交互的方法
Aug 25 #PHP
CodeIgniter整合Smarty的方法详解
Aug 25 #PHP
PHP观察者模式原理与简单实现方法示例
Aug 25 #PHP
PHP实现的策略模式简单示例
Aug 25 #PHP
php实现简单的权限管理的示例代码
Aug 25 #PHP
You might like
Yii使用ajax验证显示错误messagebox的解决方法
2014/12/03 PHP
Javascript 布尔型分析
2008/12/22 Javascript
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
2008/12/29 Javascript
jQuery 性能优化指南(2)
2009/05/21 Javascript
关于递归运算的顺序测试代码
2011/11/30 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
2013/04/02 Javascript
js导出table数据到excel即导出为EXCEL文档的方法
2013/10/10 Javascript
node.js中的fs.chown方法使用说明
2014/12/16 Javascript
JavaScipt选取文档元素的方法(推荐)
2016/08/05 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
yarn与npm的命令行小结
2016/10/20 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
javascript中apply/call和bind的使用
2017/02/15 Javascript
JavaScript之promise_动力节点Java学院整理
2017/07/03 Javascript
详解webpack babel的配置
2018/01/09 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
移动端(微信等使用vConsole调试console的方法
2019/03/05 Javascript
vue  elementUI 表单嵌套验证的实例代码
2019/11/06 Javascript
高性能js数组去重(12种方法,史上最全)
2019/12/21 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
全面解读Python Web开发框架Django
2014/06/30 Python
用Python逐行分析文件方法
2019/01/28 Python
Python绘图Matplotlib之坐标轴及刻度总结
2019/06/28 Python
python flask几分钟实现web服务的例子
2019/07/26 Python
基于Python的图像数据增强Data Augmentation解析
2019/08/13 Python
BIBLOO捷克:购买女装、男装、童装、鞋和配件
2017/01/27 全球购物
Java如何格式化日期
2012/08/07 面试题
用C语言实现文件读写操作
2013/10/27 面试题
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
《孔繁森》教学反思
2014/04/17 职场文书
乡镇领导班子批评与自我批评材料
2014/09/23 职场文书
人大代表选举标语
2014/10/07 职场文书
中考学习决心书
2015/02/04 职场文书
酒店采购员岗位职责
2015/04/03 职场文书
2016高考感言
2015/08/01 职场文书
JS实现数组去重的11种方法总结
2022/04/04 Javascript