Swoole來實現實時非同步任務佇列

2021-09-23 06:04:30 字數 2089 閱讀 3501

假如要發100封郵件,for迴圈100遍,使用者直接揭竿而起,什麼破**!

但實際上,我們很可能有超過1萬的郵件。怎麼處理這個延遲的問題?

答案就是用非同步。把「發郵件」這個操作封裝,然後後台非同步地執行1萬遍。這樣的話,使用者提交網頁後,他所等待的時間只是「把發郵件任務請求推送進佇列裡」的時間。而我們的後台服務將在使用者看不見的地方跑。

在實現「非同步佇列」這點上,有人採用mysql表或者redis來存放待傳送的郵件,然後,每分鐘定時讀取待傳送列表,然後處理。這便是定時非同步任務佇列。但當前提交的任務要一分鐘後才能執行,在某些實時性要求應用場景裡還是不快。有些場景要求,只有一提交任務,便馬上執行,但使用者不需要等待返回結果。

本文將**用php擴充套件swoole實現實時非同步任務佇列的方案。

在打算放置指令碼的目錄(你也可以自行新建)新建server.php,**如下

$curlobj = curl_init(); //初始化curl,

curl_setopt($curlobj, curlopt_url, $url); //設定**

curl_setopt($curlobj, curlopt_returntransfer, 1); //將curl_exec的結果返回

curl_setopt($curlobj, curlopt_ssl_verifypeer, false);

curl_setopt($curlobj, curlopt_ssl_verifyhost, false);

curl_setopt($curlobj, curlopt_header, 0); //是否輸出返回頭資訊

$response = curl_exec($curlobj); //執行

curl_close($curlobj); //關閉會話

return $response;

} }

$server = new server();啟動服務後,讓我們看看如何呼叫服務。新建測試檔案client_test.php

<?php  

class client

public function connect()

} public function send($data)

return $this->client->send($data);

} else

} public function close()

}

$data = array(

"url" => "",

"param" => array(

"username" => 'test',

"password" => 'test'

) );

$client = new client();

$client->connect();

if ($client->send($data)) else

$client->close();

在上面**中,url即為任務所在位址,param為所需傳遞引數。

儲存好**,在命令列或者瀏覽器中執行client_test.php,便實現了非同步任務佇列。你所填寫的url,將會在每次非同步任務被提交後,以http get的方式非同步執行。

PHP使用swoole來實現實時非同步任務佇列

使用者開啟了我們的 他要做的就是勾選需要發郵件的 商列表,然後把結算郵件發出去。假如我們需要發1封郵件,我們寫個函式執行即可。考慮到網路可能會稍微有點延遲,但是是可以接受的,使用者會乖乖等你的網頁發完郵件了再關閉網頁。假如我們要發布10封郵件,用乙個for迴圈,迴圈10遍執行發郵件操作。這時候,也許...

PHP擴充套件Swoole實現實時非同步任務佇列示例

假如要發100封郵件,for迴圈100遍,使用者直接揭竿而起,什麼破 但實際上,我們很可能有超過1萬的郵件。怎麼處理這個延遲的問題?答案就是用非同步。把 發郵件 這個操作封裝,然後後台非同步地執行1萬遍。這樣的話,使用者提交網頁後,他所等待的時間只是 把發郵件任務請求推送進佇列裡 的時間。而我們的後...

Swoole實現非同步投遞task任務案例詳解

使用場景 swolle的task模組可以用來做一些非同步的慢速任務 耗時場景。如webim中發廣播,傳送郵件等,把這些任務丟給task程序之後,worker程序可以繼續處理新的資料請求,任務完成後會非同步通知worker程序告訴它此任務已經完成。此外利用task還可以實現php的資料庫連線池,非同步...