成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于Swoole的Process進程管理模塊支付結(jié)果回調(diào)服務(wù)

wenzi / 2362人閱讀

摘要:原先用的多線程實現(xiàn)的支付結(jié)果回調(diào)服務(wù),在后期運行中出現(xiàn)了服務(wù)停止的問題,在學習的過程中,發(fā)現(xiàn)可以用的進程管理模塊實現(xiàn)多線程的功能,并且使用定時器功能實現(xiàn)進程監(jiān)控在子進程退出的時候進行重啟。

原先用PHP的Pthread多線程實現(xiàn)的支付結(jié)果回調(diào)服務(wù),在后期運行中出現(xiàn)了服務(wù)停止的問題,在學習swoole的過程中,發(fā)現(xiàn)可以用swoole的Process進程管理模塊實現(xiàn)多線程的功能,并且使用swoole_time_tick定時器功能實現(xiàn)進程監(jiā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個進程分別操作。每個進程服務(wù)運行時間不一致,當前業(yè)務(wù)時間間隔各為1s,2s,30s,30s,60s,300s,600s,600s一次

3、代碼實例
use SwooleProcess;

class MyProcess
{
    public $mpid = 0; // master pid, 即當前程序的進程ID
    public $works = []; // 記錄子進程的 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)建進程
        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) { // 子進程創(chuàng)建后需要執(zhí)行的函數(shù)
            swoole_set_process_name(" MyProcess : worker $index");
            //根據(jù)進程啟用不同時間間隔的定時器 $ms為毫秒 支付回調(diào)7次嘗試 7個進程回調(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)操作
        //......

    }

    // 重啟子進程
    public function rebootProcess($pid)
    {
        $index = array_search($pid, $this->works);
        if ($index !== false) {
            //重新創(chuàng)建進程
            $newPid = $this->createProcess($index);
            echo "rebootProcess: {$index}={$pid}->{$newPid} Done
";
            return;
        }
        throw new Exception("rebootProcess error: no pid {$pid}");
    }


    // 監(jiān)控子進程
    public function processWait()
    {
        //定時器每秒監(jiān)控
        swoole_timer_tick(1000,"MyProcess::monitor_process", "");
        /*while (1) {
            if (count($this->works)) {
                $ret = Process::wait(); // 子進程退出
                if ($ret) {
                    $this->rebootProcess($ret["pid"]);
                }
            } else {
                break;
            }
        }*/
    }

    //檢測進程
    public function monitor_process($timmerID, $params){
        foreach($this->works as $pid){
            if (!Process::kill($pid, 0)) { // 0 可以用來檢測進程是否存在
                $this->rebootProcess($pid); //重啟進程
                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://systransis.cn/yun/28404.html

相關(guān)文章

  • PHP多進程系列筆記(五)

    摘要:消息隊列更常見的用途是主進程分配任務(wù),子進程消費執(zhí)行。子進程前面加了個,這是為了防止父進程還未往消息隊列中加入內(nèi)容直接退出。 前面幾節(jié)都是講解pcntl擴展實現(xiàn)的多進程程序。本節(jié)給大家介紹swoole擴展的swoole_process模塊。 swoole多進程 swoole_process 是swoole提供的進程管理模塊,用來替代PHP的pcntl擴展。 首先,確保安裝的swoole...

    qianfeng 評論0 收藏0
  • Swoole 在 Swoft 中應(yīng)用

    摘要:在中的應(yīng)用官網(wǎng)源碼解讀號外號外歡迎大家我們開發(fā)組定了一個就線下聚一次的小目標上一篇源碼解讀反響還不錯不少同學推薦再加一篇講解一下中使用到的功能幫助大家開啟的實戰(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...

    EscapedDog 評論0 收藏0
  • Swoft 源碼剖析 - Swoole和Swoft那些事(Task投遞/定時任務(wù)篇)

    摘要:作為定時任務(wù)的執(zhí)行者,通過每喚醒自身一次,然后把執(zhí)行表遍歷一次,挑選當下需要執(zhí)行的任務(wù),通過投遞出去并更新該任務(wù)執(zhí)行表中的狀態(tài)。 作者:bromine鏈接:https://www.jianshu.com/p/b44...來源:簡書著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對原文進行了重新的排版。Swoft Github: https://github.com/swoft-clou.....

    vvpvvp 評論0 收藏0
  • Swoole 源碼分析——進程管理 Swoole_Process

    摘要:清空主進程殘留的定時器與信號。設(shè)定為執(zhí)行回調(diào)函數(shù)如果在回調(diào)函數(shù)中調(diào)用了異步系統(tǒng),啟動函數(shù)進行事件循環(huán)。因此為了區(qū)分兩者,規(guī)定并不允許兩者同時存在。 前言 swoole-1.7.2 增加了一個進程管理模塊,用來替代 PHP 的 pcntl 擴展。 PHP自帶的pcntl,存在很多不足,如 pcntl 沒有提供進程間通信的功能 pcntl 不支持重定向標準輸入和輸出 pcntl 只...

    pepperwang 評論0 收藏0
  • swoole入門4-初識swoole

    摘要:當某種網(wǎng)絡(luò)事件發(fā)生時,會回調(diào)用戶設(shè)置的指定回調(diào)函數(shù)。承擔了底層網(wǎng)絡(luò)事件的監(jiān)聽及各種底層事件處理,當收到請求時,會觸發(fā)事件提醒,然后將控制權(quán)轉(zhuǎn)交預先注冊的事件回調(diào)函數(shù),來進行后續(xù)的處理。請求到來時創(chuàng)建,請求結(jié)束后銷毀。 運行流程圖 showImg(https://segmentfault.com/img/remote/1460000017207791);showImg(https://s...

    forsigner 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<