详解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 相关文章推荐
WINXP下apache+php4+mysql
Nov 25 PHP
PHP DataGrid 实现代码
Aug 12 PHP
PHP递归调用的小技巧讲解
Feb 19 PHP
coreseek 搜索英文的问题详解
Jun 08 PHP
php读取图片内容并输出到浏览器的实现代码
Aug 08 PHP
浅析ThinkPHP中execute和query方法的区别
Jun 13 PHP
PHP多维数组转一维数组的简单实现方法
Dec 23 PHP
php编程每天必学之验证码
Mar 03 PHP
php实现websocket实时消息推送
Mar 30 PHP
laravel框架使用阿里云短信发送消息操作示例
Feb 15 PHP
ThinkPHP5框架中使用JWT的方法示例
Jun 03 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
Oct 30 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
怎样在UNIX系统下安装php3
2006/10/09 PHP
一个简单实现多条件查询的例子
2006/10/09 PHP
[原创]效率较高的php下读取文本文件的代码
2008/07/02 PHP
PHP7新增运算符用法实例分析
2016/09/26 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
ecshop添加菜单及权限分配问题
2017/11/21 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
YII框架http缓存操作示例
2019/04/29 PHP
JavaScript 精粹读书笔记(1,2)
2010/02/07 Javascript
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
js中escape对应的C#解码函数 UrlDecode
2012/12/16 Javascript
document.documentElement的一些使用技巧
2013/04/18 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
JS实现页面数据无限加载
2016/09/13 Javascript
详解AngularJS 模块化
2017/06/14 Javascript
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
python实现一次创建多级目录的方法
2015/05/15 Python
详解python并发获取snmp信息及性能测试
2017/03/27 Python
python实现基于信息增益的决策树归纳
2018/12/18 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
python3获取当前目录的实现方法
2019/07/29 Python
Django stark组件使用及原理详解
2019/08/22 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
2019/11/01 Python
python实现手势识别的示例(入门)
2020/04/15 Python
澳大利亚首屈一指的在线购物目的地:Kogan.com
2017/02/02 全球购物
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
教导处工作制度
2014/01/18 职场文书
好的旅游活动方案
2014/08/19 职场文书
上班迟到检讨书范文
2015/05/06 职场文书
2015年度优秀员工获奖感言
2015/07/31 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
python解决12306登录验证码的实现
2021/04/18 Python