详解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 相关文章推荐
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
May 29 PHP
解析PHP工厂模式的好处
Jun 18 PHP
php上传文件中文文件名乱码的解决方法
Nov 01 PHP
PHP将XML转数组过程详解
Nov 13 PHP
php全角字符转换为半角函数
Feb 07 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
Nov 04 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
Nov 24 PHP
详解WordPress开发中get_header()获取头部函数的用法
Jan 08 PHP
PHP性能优化大全(php.ini)
May 20 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
May 23 PHP
完美利用Yii2微信后台开发的系列总结
Jul 18 PHP
php爬取天猫和淘宝商品数据
Feb 23 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
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
2013/07/01 PHP
php数组合并与拆分实例分析
2015/06/12 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
PHP下的浮点运算不准的解决方法
2016/10/27 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
safari下载文件自动加了html后缀问题
2018/11/09 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
JQuery中使用Ajax赋值给全局变量失败异常的解决方法
2014/08/18 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
Sort()函数的多种用法
2016/03/20 Javascript
JavaScript实现DOM对象选择器
2016/09/24 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
2017/03/29 Javascript
微信小程序中多个页面传参通信的学习与实践
2017/05/05 Javascript
利用forever和pm2部署node.js项目过程
2017/05/10 Javascript
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
[02:16]深扒TI7聊天轮盘语音出处2
2017/05/11 DOTA
python 环境变量和import模块导入方法(详解)
2017/07/11 Python
一文总结学习Python的14张思维导图
2017/10/17 Python
python编程培训 python培训靠谱吗
2018/01/17 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
Python中Subprocess的不同函数解析
2019/12/10 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
2020/06/18 Python
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
HTML5 拖放(Drag 和 Drop)详解与实例代码
2017/09/14 HTML / CSS
化学教学随笔感言
2014/02/19 职场文书
开学典礼策划方案
2014/05/28 职场文书
2015年财务科工作总结范文
2015/05/13 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
pytorch交叉熵损失函数的weight参数的使用
2021/05/24 Python
Redis基本数据类型Set常用操作命令
2022/06/01 Redis