国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

wenzi / 2356人閱讀

摘要:原先用的多線程實現(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

相關(guān)文章

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

    摘要:消息隊列更常見的用途是主進(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...

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

    摘要:在中的應(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...

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

    摘要:作為定時任務(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.....

    vvpvvp 評論0 收藏0
  • Swoole 源碼分析——進(jìn)程管理 Swoole_Process

    摘要:清空主進(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 只...

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

    摘要:當(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...

    forsigner 評論0 收藏0

發(fā)表評論

0條評論

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