Swoole server事件回調(diào)函數(shù)

2019-08-14 19:13 更新

在swoole中,一個(gè)swoole_server的擁有若干回調(diào)函數(shù),這些回調(diào)函數(shù)決定了swoole_server的相關(guān)功能。可以通過(guò)

$serv->on( string $event, mixed $callback );

函數(shù)來(lái)配置. 示例:

class Server
{
    private $serv;
    public function __construct() {
        $this->serv = new swoole_server("0.0.0.0", 9501);
        $this->serv->set(array(
            'worker_num' => 8,
            'daemonize' => false,
            'max_request' => 10000,
            'dispatch_mode' => 2,
            'debug_mode'=> 1
        ));
        $this->serv->on('Start', array($this, 'onStart'));
        $this->serv->on('Connect', array($this, 'onConnect'));
        $this->serv->on('Receive', array($this, 'onReceive'));
        $this->serv->on('Close', array($this, 'onClose'));
        $this->serv->start();
    }
}

全部回調(diào)函數(shù)以及相關(guān)介紹如下:

[TOC]

1.onReceive

描述:接收數(shù)據(jù)的回調(diào)
函數(shù)原型:

function onReceive( swoole_server $serv, $fd, $from_id, $data );
參數(shù)描述
$servswoole_server對(duì)象
$fd連接的描述符
$from_idreactor的id,無(wú)用
$data接收到的數(shù)據(jù)

說(shuō)明:每當(dāng)server接收到客戶端發(fā)來(lái)的數(shù)據(jù)后,就會(huì)通過(guò)onReceive回調(diào)將數(shù)據(jù)投遞給Worker。如果開啟了協(xié)議檢測(cè),則會(huì)在收到完整數(shù)據(jù)包之后才會(huì)響應(yīng)回調(diào)。注意,必須設(shè)置該回調(diào)函數(shù),否則無(wú)法啟動(dòng)服務(wù)器。

2.onStart

描述:服務(wù)器啟動(dòng)的回調(diào)
函數(shù)原型:

function onStart( swoole_server $serv);
參數(shù)描述
$servswoole_server對(duì)象

說(shuō)明:
onStart事件在Master進(jìn)程的主線程中被調(diào)用。在此回調(diào)響應(yīng)之前Swoole Server已進(jìn)行了如下操作

  • 已創(chuàng)建了manager進(jìn)程
  • 已創(chuàng)建了worker子進(jìn)程
  • 已監(jiān)聽所有TCP/UDP端口
  • 已監(jiān)聽了定時(shí)器

接下來(lái)要執(zhí)行

  • 主Reactor開始接收事件,客戶端可以connect到Server

onStart回調(diào)中,僅允許echo、打印Log、修改進(jìn)程名稱。不得執(zhí)行其他操作。onWorkerStart和onStart回調(diào)是在不同進(jìn)程中并行執(zhí)行的,不存在先后順序。 可以在onStart回調(diào)中,將$serv->master_pid和$serv->manager_pid的值保存到一個(gè)文件中。這樣可以編寫腳本,向這兩個(gè)PID發(fā)送信號(hào)來(lái)實(shí)現(xiàn)關(guān)閉和重啟的操作。
從1.7.5+ Master進(jìn)程內(nèi)不再支持定時(shí)器,onMasterConnect/onMasterClose2個(gè)事件回調(diào)也徹底移除。Master進(jìn)程內(nèi)不再保留任何PHP的接口。
在onStart中創(chuàng)建的全局資源對(duì)象不能在worker進(jìn)程中被使用,因?yàn)榘l(fā)生onStart調(diào)用時(shí),worker進(jìn)程已經(jīng)創(chuàng)建好了。新創(chuàng)建的對(duì)象在主進(jìn)程內(nèi),worker進(jìn)程無(wú)法訪問到此內(nèi)存區(qū)域,因此全局對(duì)象創(chuàng)建的代碼需要放置在swoole_server_start之前。

3.onWorkerStart

描述:Worker進(jìn)程啟動(dòng)的回調(diào)
函數(shù)原型:

function onWorkerStart( swoole_server $serv,int $worker_id);
參數(shù)描述
$servswoole_server對(duì)象
$worker_idWorker進(jìn)程的id

說(shuō)明:此事件在worker進(jìn)程/task_worker啟動(dòng)時(shí)發(fā)生。

發(fā)生PHP致命錯(cuò)誤或者代碼中主動(dòng)調(diào)用exit時(shí),Worker/Task進(jìn)程會(huì)退出,管理進(jìn)程會(huì)重新創(chuàng)建新的進(jìn)程 onWorkerStart/onStart是并發(fā)執(zhí)行的,沒有先后順序

通過(guò)$worker_id參數(shù)的值來(lái),判斷worker是普通worker還是task_worker。$worker_id>= $serv->setting['worker_num'] 時(shí)表示這個(gè)進(jìn)程是task_worker。
如果想使用swoole_server_reload實(shí)現(xiàn)代碼重載入,必須在workerStart中require你的業(yè)務(wù)文件,而不是在文件頭部。在onWorkerStart調(diào)用之前已包含的文件,不會(huì)重新載入代碼。
可以將公用的,不易變的php文件放置到onWorkerStart之前。這樣雖然不能重載入代碼,但所有worker是共享的,不需要額外的內(nèi)存來(lái)保存這些數(shù)據(jù)。
onWorkerStart之后的代碼每個(gè)worker都需要在內(nèi)存中保存一份 $worker_id是一個(gè)從0-$worker_num之間的數(shù)字,表示這個(gè)worker進(jìn)程的ID $worker_id和進(jìn)程PID沒有任何關(guān)系

4.onConnect

描述:新連接接入時(shí)的回調(diào)
函數(shù)原型:

function onConnect( swoole_server $serv,int $fd, int $from_id);
參數(shù)描述
$servswoole_server對(duì)象
$fd連接的描述符
$from_idreactor的id,無(wú)用

說(shuō)明:有新的連接進(jìn)入時(shí),在worker進(jìn)程中回調(diào)。onConnect/onClose這2個(gè)回調(diào)發(fā)生在worker進(jìn)程內(nèi),而不是主進(jìn)程。如果需要在主進(jìn)程處理連接/關(guān)閉事件,請(qǐng)注冊(cè)onMasterConnect/onMasterClose回調(diào)。onMasterConnect/onMasterClose回調(diào)總是先于onConnect/onClose被執(zhí)行

5.onClose

描述:連接關(guān)閉時(shí)的回調(diào)
函數(shù)原型:

function onClose( swoole_server $serv,int $fd, int $from_id);
參數(shù)描述
$servswoole_server對(duì)象
$fd連接的描述符
$from_idreactor的id,無(wú)用

說(shuō)明:TCP客戶端連接關(guān)閉后,在worker進(jìn)程中回調(diào)此函數(shù)。無(wú)論close由客戶端發(fā)起還是服務(wù)器端主動(dòng)調(diào)用swoole_server_close關(guān)閉連接,都會(huì)觸發(fā)此事件。 因此只要連接關(guān)閉,就一定會(huì)回調(diào)此函數(shù)。

6.onTask

描述:task_worker進(jìn)程處理任務(wù)的回調(diào)
函數(shù)原型:

function onTask(swoole_server $serv, int $task_id, int $from_id, string $data);
參數(shù)描述
$servswoole_server對(duì)象
$task_id任務(wù)ID
$from_id來(lái)自于哪個(gè)worker進(jìn)程
$data任務(wù)內(nèi)容

說(shuō)明:在task_worker進(jìn)程內(nèi)被調(diào)用。worker進(jìn)程可以使用swoole_server_task函數(shù)向task_worker進(jìn)程投遞新的任務(wù)??梢灾苯訉⑷蝿?wù)結(jié)果字符串通過(guò)return方式返回給worker進(jìn)程。worker進(jìn)程將在onFinish回調(diào)中收到結(jié)果。注:如果serv->set(array('task_worker_num' => 8)) task_id 并不是從1-8 而是遞增的。

7.onFinish

描述:task_worker進(jìn)程處理任務(wù)結(jié)束的回調(diào)
函數(shù)原型:

function onFinish(swoole_server $serv, int $task_id, string $data);
參數(shù)描述
$servswoole_server對(duì)象
$task_id任務(wù)ID
$data任務(wù)結(jié)果

說(shuō)明:在此函數(shù)中會(huì)收到任務(wù)處理的結(jié)果,通過(guò)task_id和worker_id來(lái)區(qū)分不同的任務(wù)。

8.onTimer

描述:定時(shí)器觸發(fā)的回調(diào)
函數(shù)原型:

function onTimer(swoole_server $serv, int $interval);
參數(shù)描述
$servswoole_server對(duì)象
$interval定時(shí)的間隔

說(shuō)明:定時(shí)器被觸發(fā)時(shí),該函數(shù)被調(diào)用。通過(guò)interval來(lái)區(qū)分不同時(shí)間間隔的定時(shí)器。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)