详解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加MYSQL服务器
Oct 09 PHP
剖析 PHP 中的输出缓冲
Dec 21 PHP
phpinfo 系统查看参数函数代码
Jun 05 PHP
php &amp;&amp; 逻辑与运算符使用说明
Mar 04 PHP
PHP 八种基本的数据类型小结
Jun 01 PHP
PHP针对JSON操作实例分析
Jan 12 PHP
Thinkphp关闭缓存的方法
Jun 26 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
Jan 07 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
PHP ADODB生成下拉列表框功能示例
May 29 PHP
PHP实现微信退款功能
Oct 02 PHP
PHP addslashes()函数讲解
Feb 03 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 类商品秒杀计时实现代码
2010/05/05 PHP
smarty中先strip_tags过滤html标签后truncate截取文章运用
2010/10/25 PHP
PHP实现的简单网络硬盘
2015/07/29 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
JS解密入门之凭直觉解
2008/06/25 Javascript
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
JavaScript异步编程Promise模式的6个特性
2014/04/03 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
详解基于 Nuxt 的 Vue.js 服务端渲染实践
2017/10/24 Javascript
使用vue-router设置每个页面的title方法
2018/02/11 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
多页vue应用的单页面打包方法(内含打包模式的应用)
2020/06/11 Javascript
将图片文件嵌入到wxpython代码中的实现方法
2014/08/11 Python
Python列表生成器的循环技巧分享
2015/03/06 Python
python动态参数用法实例分析
2015/05/25 Python
python学习之编写查询ip程序
2016/02/27 Python
Python正则抓取新闻标题和链接的方法示例
2017/04/24 Python
python 实时得到cpu和内存的使用情况方法
2018/06/11 Python
Flask框架WTForm表单用法示例
2018/07/20 Python
Python 新建文件夹与复制文件夹内所有内容的方法
2018/10/27 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
pytorch实现MNIST手写体识别
2020/02/14 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
Python常见反爬虫机制解决方案
2020/06/01 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
关于圣诞节的广播稿
2014/01/26 职场文书
八项规定对照检查材料
2014/08/31 职场文书
地球物理学专业推荐信
2014/09/08 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书
幼儿园教师自我评价
2015/03/04 职场文书
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python
Go语言入门exec的基本使用
2022/05/20 Golang