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

2022-08-03 15:18:18 字數 2310 閱讀 4872

使用者開啟了我們的**。他要做的就是勾選需要發郵件的**商列表,然後把結算郵件發出去。

假如我們需要發1封郵件,我們寫個函式執行即可。考慮到網路可能會稍微有點延遲,但是是可以接受的,使用者會乖乖等你的網頁發完郵件了再關閉網頁。

假如我們要發布10封郵件,用乙個for迴圈,迴圈10遍執行發郵件操作。這時候,也許10倍的網路延遲會讓使用者稍微有點不耐煩,但勉強可以等吧。

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

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

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

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

在雲平台sae和bae上,都有taskqueue服務來解決上面的問題。而如果是自己假設伺服器,則如何解決?本文將**用php擴充套件swoole實現實時非同步任務佇列的方案。

pecl 安裝:

pecl install swoole

看命令列提示,如果它提示說沒有寫php.ini,則自己手動在php.ini後面加上:

extension = "swoole.so"

在打算放置指令碼的目錄(你也可以自行新建)新建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();

由於服務端是非同步、常駐記憶體的,因此必須通過命令列來啟動。在命令列執行以上**以啟動服務

php server.php

執行完畢後關閉命令列視窗即可。服務會在後台以守護程序執行

啟動服務後,讓我們看看如何呼叫服務。新建測試檔案client_test.php

**如下:

<?php

class client

public function connect()

$data = array(

"url" => "" ,

"param" => array(

"username"=>'test',

"password" => 'test'));

$json_data = json_encode($data);

$this->client->send( $json_data );

}}$client = new client();

$client->connect();

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

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

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

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

PHP實現實時輸出

這個問題是在本地的環境中發現的。指令碼輸出的內容要等全部執行完畢後才會輸出,而sae是實時輸出的,避免了長時間等待。網上摘錄,純筆記。header content type text html charset utf 8 設定執行時間不限時 set time limit 0 清除並關閉緩衝,輸出到瀏...