美工统筹SEO,为企业电子商务营销助力!
详解PHP swoole process的操纵体例
一佰互联网站建造(www.taishanly.com) 宣布日期 2020-04-25 14:41:29 阅读数: 141
引入背景:假设咱们天天有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 "; 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后加入后会被主动拉起
以上便是本文的全数内容,但愿对大师的进修有所赞助,也但愿大师多多撑持网页设想。