假如要發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的資料庫連線池,非同步...