1. 程式人生 > >Swoole入門:執行非同步任務01(使用案列,簡單邏輯梳理)

Swoole入門:執行非同步任務01(使用案列,簡單邏輯梳理)

比如有這樣一個需求:前端使用者登錄檔單提交入庫,緊接著傳送確認郵件,然後贈送積分。
如果這三部分是一個同步任務,那麼使用者在前端要等待最後“贈送積分”完成,才能確定自己是否註冊成功。
如果是非同步任務,那麼我們可以在”使用者登錄檔單提交入庫”成功之後,就返回給前端使用者。

這裡寫圖片描述

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