摘要:原先用的多線程實現(xiàn)的支付結(jié)果回調(diào)服務(wù),在后期運(yùn)行中出現(xiàn)了服務(wù)停止的問題,在學(xué)習(xí)的過程中,發(fā)現(xiàn)可以用的進(jìn)程管理模塊實現(xiàn)多線程的功能,并且使用定時器功能實現(xiàn)進(jìn)程監(jiān)控在子進(jìn)程退出的時候進(jìn)行重啟。
原先用PHP的Pthread多線程實現(xiàn)的支付結(jié)果回調(diào)服務(wù),在后期運(yùn)行中出現(xiàn)了服務(wù)停止的問題,在學(xué)習(xí)swoole的過程中,發(fā)現(xiàn)可以用swoole的Process進(jìn)程管理模塊實現(xiàn)多線程的功能,并且使用swoole_time_tick定時器功能實現(xiàn)進(jìn)程監(jiān)控在子進(jìn)程退出的時候進(jìn)行重啟。1、開發(fā)環(huán)境
? ? Swoole版本:2.0.12
? ? PHP版本:7.1
? ? 服務(wù)器版本:Ubuntu 14.04 64位
2、業(yè)務(wù)場景? ? 游戲APP在支付后,在支付寶,微信等回調(diào)支付結(jié)果后,將支付結(jié)果回調(diào)給游戲服務(wù)器。回調(diào)邏輯為:25 小時以內(nèi)完成 8 次通知(通知的間隔頻率一般是:0s,2m,10m,10m,1h,2h,6h,15h)。第一次通知在接收到結(jié)果時同時回調(diào)。所以另外7次間隔性回調(diào)由7個進(jìn)程分別操作。每個進(jìn)程服務(wù)運(yùn)行時間不一致,當(dāng)前業(yè)務(wù)時間間隔各為1s,2s,30s,30s,60s,300s,600s,600s一次
3、代碼實例use SwooleProcess; class MyProcess { public $mpid = 0; // master pid, 即當(dāng)前程序的進(jìn)程ID public $works = []; // 記錄子進(jìn)程的 pid public $maxProcessNum = 7; public $newIndex = 1; public function __construct() { try { swoole_set_process_name(" MyProcess : master"); $this->mpid = posix_getpid(); $this->run(); $this->processWait(); } catch (Exception $e) { die("Error: ". $e->getMessage()); } } public function run() { //創(chuàng)建進(jìn)程 for ($i=0; $i<=$this->maxProcessNum; $i++) { $this->createProcess($i); } } public function createProcess($index = null) { if (is_null($index)) { $index = $this->newIndex; $this->newIndex++; } echo date("Y-m-d H:i:s") . " | createProcess index=".$index.PHP_EOL; $process = new swoole_process(function (swoole_process $worker) use($index) { // 子進(jìn)程創(chuàng)建后需要執(zhí)行的函數(shù) swoole_set_process_name(" MyProcess : worker $index"); //根據(jù)進(jìn)程啟用不同時間間隔的定時器 $ms為毫秒 支付回調(diào)7次嘗試 7個進(jìn)程回調(diào)服務(wù) 每次回調(diào)的間隔時間不一致,實行25 小時以內(nèi)完成 8 次通知(通知的間隔頻率一般是:2m,10m,10m,1h,2h,6h,15h) switch ($index) { case 0; $ms = 1000; break; case 1; $ms = 2000; break; case 2; $ms = 30000; break; case 3; $ms = 30000; break; case 4; $ms = 60000; break; case 5; $ms = 300000; break; case 6; $ms = 600000; break; case 7; $ms = 600000; break; } //啟用定時器 $timer=swoole_timer_tick($ms,"MyProcess::deal_pay_notify", $index); }, false, false); // 不重定向輸入輸出; 不使用管道 $pid = $process->start(); $this->works[$index] = $pid; return $pid; } /* * 處理支付回調(diào) */ function deal_pay_notify($timmerID, $params){ echo date("Y-m-d H:i:s") . " | timmerID=".$timmerID." params=".$params.PHP_EOL; //支付結(jié)果回調(diào)操作 //...... } // 重啟子進(jìn)程 public function rebootProcess($pid) { $index = array_search($pid, $this->works); if ($index !== false) { //重新創(chuàng)建進(jìn)程 $newPid = $this->createProcess($index); echo "rebootProcess: {$index}={$pid}->{$newPid} Done "; return; } throw new Exception("rebootProcess error: no pid {$pid}"); } // 監(jiān)控子進(jìn)程 public function processWait() { //定時器每秒監(jiān)控 swoole_timer_tick(1000,"MyProcess::monitor_process", ""); /*while (1) { if (count($this->works)) { $ret = Process::wait(); // 子進(jìn)程退出 if ($ret) { $this->rebootProcess($ret["pid"]); } } else { break; } }*/ } //檢測進(jìn)程 public function monitor_process($timmerID, $params){ foreach($this->works as $pid){ if (!Process::kill($pid, 0)) { // 0 可以用來檢測進(jìn)程是否存在 $this->rebootProcess($pid); //重啟進(jìn)程 echo date("Y-m-d H:i:s") . " | monitor_process pid=".$pid. " restart".PHP_EOL; } } } } new MyProcess();
gitee:https://gitee.com/oydm/codes/...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/28404.html
摘要:消息隊列更常見的用途是主進(jìn)程分配任務(wù),子進(jìn)程消費執(zhí)行。子進(jìn)程前面加了個,這是為了防止父進(jìn)程還未往消息隊列中加入內(nèi)容直接退出。 前面幾節(jié)都是講解pcntl擴(kuò)展實現(xiàn)的多進(jìn)程程序。本節(jié)給大家介紹swoole擴(kuò)展的swoole_process模塊。 swoole多進(jìn)程 swoole_process 是swoole提供的進(jìn)程管理模塊,用來替代PHP的pcntl擴(kuò)展。 首先,確保安裝的swoole...
摘要:在中的應(yīng)用官網(wǎng)源碼解讀號外號外歡迎大家我們開發(fā)組定了一個就線下聚一次的小目標(biāo)上一篇源碼解讀反響還不錯不少同學(xué)推薦再加一篇講解一下中使用到的功能幫助大家開啟的實戰(zhàn)之旅服務(wù)器開發(fā)涉及到的相關(guān)技術(shù)領(lǐng)域的知識非常多不日積月累打好基礎(chǔ)是很難真正 date: 2017-12-14 21:34:51title: swoole 在 swoft 中的應(yīng)用 swoft 官網(wǎng): https://www.sw...
摘要:作為定時任務(wù)的執(zhí)行者,通過每喚醒自身一次,然后把執(zhí)行表遍歷一次,挑選當(dāng)下需要執(zhí)行的任務(wù),通過投遞出去并更新該任務(wù)執(zhí)行表中的狀態(tài)。 作者:bromine鏈接:https://www.jianshu.com/p/b44...來源:簡書著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對原文進(jìn)行了重新的排版。Swoft Github: https://github.com/swoft-clou.....
摘要:清空主進(jìn)程殘留的定時器與信號。設(shè)定為執(zhí)行回調(diào)函數(shù)如果在回調(diào)函數(shù)中調(diào)用了異步系統(tǒng),啟動函數(shù)進(jìn)行事件循環(huán)。因此為了區(qū)分兩者,規(guī)定并不允許兩者同時存在。 前言 swoole-1.7.2 增加了一個進(jìn)程管理模塊,用來替代 PHP 的 pcntl 擴(kuò)展。 PHP自帶的pcntl,存在很多不足,如 pcntl 沒有提供進(jìn)程間通信的功能 pcntl 不支持重定向標(biāo)準(zhǔn)輸入和輸出 pcntl 只...
摘要:當(dāng)某種網(wǎng)絡(luò)事件發(fā)生時,會回調(diào)用戶設(shè)置的指定回調(diào)函數(shù)。承擔(dān)了底層網(wǎng)絡(luò)事件的監(jiān)聽及各種底層事件處理,當(dāng)收到請求時,會觸發(fā)事件提醒,然后將控制權(quán)轉(zhuǎn)交預(yù)先注冊的事件回調(diào)函數(shù),來進(jìn)行后續(xù)的處理。請求到來時創(chuàng)建,請求結(jié)束后銷毀。 運(yùn)行流程圖 showImg(https://segmentfault.com/img/remote/1460000017207791);showImg(https://s...
閱讀 1996·2021-11-23 10:08
閱讀 2326·2021-11-22 15:25
閱讀 3270·2021-11-11 16:55
閱讀 764·2021-11-04 16:05
閱讀 2577·2021-09-10 10:51
閱讀 704·2019-08-29 15:38
閱讀 1574·2019-08-29 14:11
閱讀 3481·2019-08-29 12:42