Swoole入門:執行非同步任務01(使用案列,簡單邏輯梳理)
阿新 • • 發佈:2019-02-20
比如有這樣一個需求:前端使用者登錄檔單提交入庫,緊接著傳送確認郵件,然後贈送積分。
如果這三部分是一個同步
任務,那麼使用者在前端要等待最後“贈送積分”完成,才能確定自己是否註冊成功。
如果是非同步
任務,那麼我們可以在”使用者登錄檔單提交入庫”成功之後,就返回給前端使用者。
1、處理使用者註冊的swoole服務端程式碼 user_reg_server.php
<?php
/**
* 這是我們處理使用者註冊swoole服務程式碼
*
*/
$serv = new swoole_server("10.211.55.15", 9501);
// 設定非同步任務的工作程序數量
$serv->set(array('task_worker_num' => 4));
$serv->on('receive', function($serv, $fd, $from_id, $data) {
if(1){ // if裡是虛擬碼:使用者資料入庫邏輯
// 如果入庫成功,後面2個任務才非同步執行
// 投遞"傳送郵件"這個非同步任務
$task_email = $serv->task($data); // 這裡的$data 是客戶端傳遞過來的
// 投遞"贈送積分"這個非同步任務
$task_gif = $serv->task($data);
// 上面2個非同步任務成功分發
// 可以給客戶端傳送一個提示資訊
$serv->send($fd, "register success");
}
});
// 處理非同步任務
$serv->on('task', function ($serv, $task_id, $from_id, $data) {
// 執行任務的具體程式碼
echo "New AsyncTask[id=$task_id]".PHP_EOL;
//返回任務執行的結果
return 1; // 在onTask函式中只要return一個字串或者非null的變數,都表示投遞的task已完成
});
// 處理非同步任務的結果
$serv->on('finish', function ($serv, $task_id, $data) {
echo "AsyncTask[$task_id] Finish: $data".PHP_EOL;
});
// 開始
$serv->start();
2、客戶端使用者註冊,連線上swoole,傳遞資料 addUser.php
<?php
/*
* 這是使用者註冊部分,使用者註冊邏輯(也就是我們的web網站可能和我們的Swoole服務不在同一臺機器上)
* */
$userInfo = ['name'=>'jack','email'=>'[email protected]']; // 這是我們準備傳遞給swoole服務端的資料
// 建立swoole客戶端
$client = new swoole_client(SWOOLE_SOCK_TCP);
if (!$client->connect("10.211.55.15", 9501, -1))
{
exit("connect failed. Error: {$client->errCode}\n");
}
// 傳送 使用者資料 到服務端
$client->send(json_encode($userInfo));
// 接收服務端返回的內容
echo $client->recv();
// 關閉客戶端
$client->close();
開始服務,客戶端去連線會很快返回register success
。
服務端列印:
New AsyncTask[id=1]
New AsyncTask[id=0]
AsyncTask[1] Finish: 1
AsyncTask[0] Finish: 1