swoole異步隊(duì)列講解

思路:首先swoole作為后臺守護(hù)進(jìn)程處理耗時(shí)的任務(wù)(Job)盾计,通過swoole_client將任務(wù)丟進(jìn)后臺Job去處理疏魏,等候處理完畢將結(jié)果通知到回調(diào)Url上宏榕,一個(gè)Job處理完畢黄橘。

話不多說呐矾,先看代碼實(shí)現(xiàn)過程

1信不、隊(duì)列處理(核心):server.php

<?php

$serv = new swoole_server("192.168.206.128", 9502);

// 設(shè)置異步任務(wù)的工作進(jìn)程數(shù)量
$serv->set(['task_worker_num' => 4]);

$serv->on('receive', function($serv, $fd, $from_id, $data) {
    $serv->send($fd, '{"status":true}');
    //投遞異步任務(wù)   
    $serv->task($data);
});

// 處理異步任務(wù)
$serv->on('task', function ($serv, $task_id, $from_id, $data) {
    // 休眠模擬任務(wù)處理時(shí)間
    sleep(5);
    $serv->finish($data);
});

// 處理異步任務(wù)的結(jié)果
$serv->on('finish', function ($serv, $task_id, $data) {
    
    $data = json_decode($data, true);
    $callbackInfo = parse_url($data['callback']);

    // 利用協(xié)程發(fā)起處理完成的通知請求
    go(function () use ($callbackInfo) {
        $cli = new Swoole\Coroutine\Http\Client($callbackInfo['host'], ($callbackInfo['scheme'] === 'http' ? 80 : 443));

        // 發(fā)起Http POST請求
        $cli->post($callbackInfo['path'], ['status' => true]);
        echo $cli->body . PHP_EOL;
        
        $cli->close();
    });
});

$serv->start();

面向?qū)ο蟀?/h5>
<?php

use Swoole\Server as SwooleServer;
use Swoole\Coroutine\Http\Client as HttpClient;

class Server
{

    private $server = null;

    public function __construct()
    {
        $this->server = new SwooleServer('192.168.206.128', 9502);

        // 設(shè)置異步任務(wù)的工作進(jìn)程數(shù)量
        $this->server->set([
            'worker_num'      => 2,
            'task_worker_num' => 2
        ]);

        // 添加事件監(jiān)聽
        $this->server->on('start', [$this, 'onStart']);
        $this->server->on('connect', [$this, 'onConnect']);
        $this->server->on('receive', [$this, 'onReceive']);
        $this->server->on('task', [$this, 'onTask']);
        $this->server->on('finish', [$this, 'onFinish']);
        $this->server->on('close', [$this, 'onClose']);

        $this->server->start();
    }

    public function onStart($server)
    {
        echo 'Server start...'.PHP_EOL;
    }

    public function onConnect($server, $fd, $reactorId)
    {
        echo '新的連接:'.$fd.PHP_EOL;
    }

    public function onReceive($server, $fd, $reactorId, $data)
    {
        echo '收到數(shù)據(jù):'.$data.PHP_EOL;

        $data = json_decode($data, true);
        if (!$data) {
            $server->send($fd, json_encode([
                'status'  => false,
                'message' => '數(shù)據(jù)有誤'
            ], JSON_UNESCAPED_UNICODE));

            $server->close($fd, true);
        }

        $server->send($fd, json_encode([
            'status'  => true,
            'message' => '等待處理'
        ], JSON_UNESCAPED_UNICODE));

        // 開始執(zhí)行異步任務(wù)
        $server->task($data);
    }

    public function onTask($server, $taskId, $srcWorkerId, $data)
    {
        if (!isset($data['task_url'])) {
            $server->finish($data);
        }

        // 利用協(xié)程發(fā)起處理請求
        go(function () use ($server, $data) {
            $callbackInfo = parse_url($data['task_url']);
            $cli = new HttpClient($callbackInfo['host'], ($callbackInfo['scheme'] === 'http' ? 80 : 443));

            $cli->setHeaders([
                'Content-Type' => "application/json"
            ]);

            // 發(fā)起Http POST請求
            $cli->post($callbackInfo['path'], ['status' => true]);
            // echo $cli->body.':'.date('H:i:s').PHP_EOL;

            $cli->close();
            $server->finish($data);
        });
    }

    public function onFinish($server, $taskId, $data)
    {
        echo '處理完成:'.$taskId.PHP_EOL;
    }

    public function onClose($server, $fd, $reactorId)
    {
        echo '斷開連接:'.$fd.PHP_EOL;
    }

}

new Server();


run:php server.php
image.png
2嘲叔、接口:client.php(業(yè)務(wù)中可以自行封裝至框架中)

<?php

$client = new swoole_client(SWOOLE_SOCK_TCP);

if (!$client->connect('192.168.206.128', 9502, -1)) {
    exit("connect failed. Error: {$client->errCode}\n");
}
$data = [
    'callback' => 'http://192.168.206.128/callback.php'// 處理完成通知地址
];
$client->send(json_encode($data));

// 輸出任務(wù)響應(yīng)信息 {"status":true}
$res = json_decode($client->recv(), true);
$client->close();

if ($res['status']) {
    echo 'success';
} else {
    echo 'error';
}

run:postman直接請求client.php
image.png
3、接收結(jié)果:callback.php

<?php

$data = file_get_contents('php://input');

file_put_contents('./result.log', $data . PHP_EOL, FILE_APPEND);

echo 'success';

最后callback.php去完善任務(wù)處理成功做的一下事情
image.png
相信看完你已經(jīng)了解swoole異步隊(duì)列的一些應(yīng)用了
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抽活,一起剝皮案震驚了整個(gè)濱河市硫戈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酌壕,老刑警劉巖掏愁,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異卵牍,居然都是意外死亡果港,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門糊昙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辛掠,“玉大人,你說我怎么就攤上這事÷荞茫” “怎么了回挽?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長猩谊。 經(jīng)常有香客問我千劈,道長,這世上最難降的妖魔是什么牌捷? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任墙牌,我火速辦了婚禮,結(jié)果婚禮上暗甥,老公的妹妹穿的比我還像新娘喜滨。我一直安慰自己,他們只是感情好撤防,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布虽风。 她就那樣靜靜地躺著,像睡著了一般寄月。 火紅的嫁衣襯著肌膚如雪辜膝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天剥懒,我揣著相機(jī)與錄音内舟,去河邊找鬼合敦。 笑死初橘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的充岛。 我是一名探鬼主播保檐,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼崔梗!你這毒婦竟也來了夜只?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蒜魄,失蹤者是張志新(化名)和其女友劉穎扔亥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谈为,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旅挤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伞鲫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粘茄。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出柒瓣,到底是詐尸還是另有隱情儒搭,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布芙贫,位于F島的核電站搂鲫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏磺平。R本人自食惡果不足惜默穴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望褪秀。 院中可真熱鬧蓄诽,春花似錦、人聲如沸媒吗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闸英。三九已至锯岖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甫何,已是汗流浹背出吹。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辙喂,地道東北人捶牢。 一個(gè)月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像巍耗,于是被迫代替她去往敵國和親秋麸。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • swoole 安裝用的是centOSphp安裝目錄:/usr/local/php php.ini配置文件路徑:/u...
    a十二_4765閱讀 11,847評論 3 9
  • 一炬太、進(jìn)程的基本知識 什么是進(jìn)程灸蟆,所謂進(jìn)程其實(shí)就是操作系統(tǒng)中一個(gè)正在運(yùn)行的程序,我們在一個(gè)終端當(dāng)中亲族,通過php炒考,運(yùn)行...
    王玉偉的偉閱讀 2,092評論 0 7
  • 進(jìn)程 子進(jìn)程會復(fù)制父進(jìn)程的IO句柄(fd描述符) 進(jìn)程間通信方式 管道 管道是一組兩個(gè)特殊的文件描述符 管道需要在...
    JunChow520閱讀 1,169評論 0 0
  • 進(jìn)程間通信——隊(duì)列和管道(multiprocess.Queue斋枢、multiprocess.Pipe) 進(jìn)程間通信 ...
    go以恒閱讀 1,786評論 0 3
  • 什么是swoole swoole是PHP的異步、并行女气、高性能網(wǎng)絡(luò)通信引擎杏慰,使用純C語言編寫,提供了PHP語言的異步...
    xinyuans閱讀 520評論 0 0