swoole入門教程02-Swoole的Task使用以及swoole_client

第二章 Swoole的task使用以及swoole_client

環境說明: 系統:Ubuntu14.04 (安裝教程包括CentOS6.5)
PHP版本:PHP-5.5.10
swoole版本:1.7.6-stable
php

上一章已經簡單介紹瞭如何寫一個簡單的Echo服務器,並瞭解了onReceive等幾個核心回調函數的使用方法。這一章,我將介紹如何使用Swoole的異步任務Task。mysql

1.Task簡介

Swoole的業務邏輯部分是同步阻塞運行的,若是遇到一些耗時較大的操做,例如訪問數據庫、廣播消息等,就會影響服務器的響應速度。所以Swoole提供了Task功能,將這些耗時操做放到另外的進程去處理,當前進程繼續執行後面的邏輯。git

2.開啓Task功能

開啓Task功能只須要在swoole_server的配置項中添加task_worker_num一項便可,以下:github

$serv->set(array(
    'task_worker_num' => 8
));

便可開啓task功能。此外,必須給swoole_server綁定兩個回調函數:onTaskonFinish。這兩個回調函數分別用於執行Task任務和處理Task任務的返回結果。sql

3.使用Task

首先是發起一個Task,代碼以下:數據庫

public function onReceive( swoole_server $serv, $fd, $from_id, $data ) {
        echo "Get Message From Client {$fd}:{$data}\n";
        // send a task to task worker.
        $param = array(
            'fd' => $fd
        );
        // start a task
        $serv->task( json_encode( $param ) );

        echo "Continue Handle Worker\n";
    }

能夠看到,發起一個任務時,只需經過swoole_server對象調用task函數便可發起一個任務。swoole內部會將這個請求投遞給task_worker,而當前Worker進程會繼續執行。json

當一個任務發起後,task_worker進程會響應onTask回調函數,以下:服務器

public function onTask($serv,$task_id,$from_id, $data) {
        echo "This Task {$task_id} from Worker {$from_id}\n";
        echo "Data: {$data}\n";
        for($i = 0 ; $i < 10 ; $i ++ ) {
            sleep(1);
            echo "Taks {$task_id} Handle {$i} times...\n";
        }
        $fd = json_decode( $data , true )['fd'];
        $serv->send( $fd , "Data in Task {$task_id}");
        return "Task {$task_id}'s result";
    }

這裏我用sleep函數和循環模擬了一個長耗時任務。在onTask回調中,咱們經過task_id和from_id(也就是worker_id)來區分不一樣進程投遞的不一樣task。當一個task執行結束後,經過return一個字符串將執行結果返回給Worker進程。Worker進程將經過onFinish回調函數接收這個處理結果。swoole

下面來看onFinish回調:架構

public function onFinish($serv,$task_id, $data) {
        echo "Task {$task_id} finish\n";
        echo "Result: {$data}\n";
    }

onFinish回調中,會接收到Task任務的處理結果$data。在這裏處理這個返回結果便可。 (Tip: 能夠經過在傳遞的data中存放fd、buff等數據,來延續投遞Task以前的工做)

點此查看完整示例

4.swoole_client

之因此在這裏講解如何使用swoole_client是由於,在寫服務端代碼的時候,不可避免的須要用到客戶端來進行測試。swoole提供了swoole_client用於編寫測試客戶端,下面我將講解如何使用這個工具。

swoole_client有兩種工做模式:同步阻塞模式和異步回調模式。其中,同步阻塞模式在上一章中已經給出示例,其使用和通常的socket基本無異。所以,我將重點講解swoole_client的異步回調模式。

建立一個異步client的代碼以下:

$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);

其中,SWOOLE_SOCK_ASYNC選項即代表建立一個異步client。

既然是異步,那固然須要回調函數。swoole_client一共有四個回調函數,以下:

$client->on("connect", function($cli) {
    $cli->send("hello world\n");
});
$client->on("receive", function($cli, $data){
    echo "Received: ".$data."\n";
});
$client->on("error", function($cli){
    echo "Connect failed\n";
});
$client->on("close", function($cli){
    echo "Connection close\n";
});

這幾個回調函數的做用基本和swoole_server相似,只有參數不一樣,所以再也不贅述。 點此查看完整示例

進階:簡易聊天室

我用swoole擴展寫了一個簡單的聊天室Demo(點此查看) 這個Demo雖然用到了一些其餘的架構,可是核心功能仍然是依託swoole擴展實現的。

  • 經過onReceive回調接收數據,根據預先規定的字段找到對應的處理函數。
  • 經過onTask處理髮送數據、廣播這樣的耗時內容。

Server.php是所有的Swoole回調函數實現的類。

下章預告:Timer計時器、心跳檢測及Task進階實例:mysql鏈接池。

相關文章
相關標籤/搜索