假如要發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擴充套件實現資料實時更新 上
如果想對乙個列表做實時的更新,傳統的做法是採用輪詢的方式。以web為例,通過ajax定時請求服務端然後獲取資料顯示在頁面。這種方式實現簡單,缺點就是浪費資源。http1.1新增加了對websocket的支援,這樣就可以將被動展示轉變為主動通知。也就是通過websocket與服務端保持持久鏈結,一旦資...
使用php的swoole擴充套件實現資料實時更新 下
先說一下業務場景。我們目前的大多數應用都是以服務端 介面 客戶端的方式去協調工作的,這樣的好處在於不論是處在何種終端的情況下,都可以完美的和服務端相容。這樣就輕鬆實現了mvc各個部分的真正解耦。但是提高程式的友好性還是有很多路要走,其中乙個大家都會遇到的就是資料實時更新的問題。比如乙個使用者在手機上...