swoole學習之: 服務端(異步風格)-TCP/UDP服務器 - Swoole\Server的方法(二)

方法太多, 接前面 swoole學習之: 服務端(異步風格)-TCP/UDP服務器 - Swoole\Server的方法, 繼續敲....

reload(): 安全地重啓所有 Worker/Task 進程

Swoole\Server->reload(bool $only_reload_taskworker = false): bool
  • bool $only_reload_taskworker: 是否僅重啓task進程

reload 有保護機制,當一次 reload 正在進行而未結束時, 再次發送reload指令會被丟棄

注意:

  • 平滑重啓只對onWorkerStartonReceive等在Worker進程中include/require的PHP文件有效
  • Server啓動前就已經引入的PHP文件無效
  • 對於Server的配置,即$server->set()中傳入的參數, 必須重啓整個server
  • Server可以監聽一個內網端口, 然後接收遠程的控制命令來重啓所有Worker進程

Stop(): 停止當前Worker進程並立即觸發onWorkerStop回調

Swoole\Server->stop(int $workerId = -1, bool $waitEvent = false): bool
  • $workerId: 指定worker id
  • $waitEvent: 退出策略, false表示立即退出(不等待時間循環結束), true表示等待事件循環結束

設置 waitEvent=true後, 底層會使用異步安全重啓策略: 先通知Manager進程, 然後重新啓動一個新的Worker進程來處理新的請求, 指定的那個舊的Worker會等待事件, 直到事件循環爲空或超過max_wait_time後退出進程

shutown(): 關閉服務

Swoole\Server->shutdown(): void
  • 此函數可以用在Worker進程內
  • kill進程, 即向主進程發送SIGTERM(信息編號爲15)也可以關閉服務:
kill -15 主進程pid

使用 kill -l 命令列出所有可用信號, 最常用的信號是:

  • 1 (SIGHUP): 重新加載進程
  • 9 (SIGKILL): 殺死一個進程
  • 15 (SIGTERM): 正常停止一個進程

tick(): 添加定時器

Swoole\Timer::tick的別名. 可以自定義回調函數.

Swoole\Server->tick(int $millisecond, mixed $callback):void
  • millisecond: 間隔時間, 單位: 毫秒(千分之一秒)
  • callback: 回調函數, 可以是函數名稱, 靜態方法名, 或者閉包函數 注意:
  • Worker進程結束後, 所有定時器都會自動銷燬
  • tick/after定時器不能在Server->start之前使用
$server = new Swoole\Server('127.0.0.1', 9502);

//在onWorkerStart中使用: 啓動後每隔1s在服務端打印一次信息
$server->on('workerstart', function($server, $workerId){
    if(!$server->taskworker){
        $server->tick(1000, function($id){
            echo 'id: '.$id.', time is:'.date('Y-m-d H:i:s').PHP_EOL;
        });
    }else{
        $server->tick(1000);
    }
});

//在OnReceive中使用:  接收到一次數據之後, 會每個1s向客戶端發送一次信息
$server->on('Receive', function($server, $fd, $reactor_id, $data){
    //$reactor_id: TCP連接所在的Reactor線程ID, int
    echo date('Y-m-d H:i:s').' Client '.$fd.' send message: '.trim($data).PHP_EOL;
    $server->tick(1000, function()use($server, $fd, $reactor_id){
        $server->send($fd, 'Hello, your id:'.$fd.', reactor_id:'.$reactor_id.', time is:'.date('Y-m-d H:i:s').PHP_EOL);
    });
});

//啓動服務
$server->start();

after(): 添加一個一次性定時器

Swoole\Timer::after的別名. 這個一次性定時器執行完成後即自行銷燬.

Swoole'Server->after(int $millisecond, mixed $callback);

注意: callback函數不接受任何參數, but WHY?

defer(): 延後執行一個函數

Event::defer的別名

Swoole\Server->defer(callable $callback): void
  • callback: 可以是可執行的函數變量、字符串、數組、匿名(閉包)函數

注意:

  • 底層會再EventLoop循環完成後執行此函數. 此函數的目的是爲了讓一些PHP代碼延後執行,程序優先處理其他的IO事件.比如, 某個回調函數有cpu密集計算而又不是很着急,可以讓進程處理完其他的事件再去進行cpu密集計算.
  • 底層不保證defer的函數會立即執行. 如果是系統關鍵邏輯, 需要儘快執行, 請使用after定時器實現
  • 在onWorkerStart回調中執行defer時, 必須等到有事件發生纔會回調

e.g:

function dbQuery($server, $db){
    $server->defer(function() use ($db){
        $db->close();
    });
}

clearTimer(): 清除 tick\after的定時器

Swoole\Timer::clear的別名, 用於清除由tick,after建立的定時器.

Swoole\Server->clearTimer(int $timerId): bool

clearTimer僅可用於清除當前進程的定時器

e.g:

$timerId = $server->tick(function($id) use($server){
    $server->clearTimer($id);//$id是定時器的id
};

close(): 關閉客戶端連接

Swoole\Server->close(int $fd, bool $reset=false): bool
  • $fd: 指定要關閉的tcp連接的文件描述符,在swoole_server中是客戶端的唯一標識符
  • $reset: 爲true會強制關閉連接, 並丟棄發送隊列中的數據 注意:
  • Server主動close連接, 或者客戶端close連接, 都會觸發onClose事件
  • 不要在close之後寫相關的數據清理邏輯, 應當放置到onClose回調中處理
  • HTTP\Serverfd在上層回調方法的response對象中獲取 e.g:
$server->on('request', function($request, $response) use ($server) {
    $fd = $request->fd;//獲取fd
    $server->send($fd, 'Server closed your connection').PHP_EOL;
    $server->close($fd);
})

send(): 向客戶端發送數據

Swoole\Server->send(int $fd, string $data, int $serverSocket=-1): bool
  • int $fd: 客戶端連接的唯一標識
  • string $data: 要發送的數據
  • int $serverSocket: 向UnixSocketDGRAM對端發送數據時需要此項參數, TCP客戶端不需要填寫

發送過程是異步的, 底層會自動監聽客戶端, 將數據逐步發送給客戶端, 也就是說不是服務端send之後客戶端立馬就能收到數據了

  • 安全性
    • send操作具有原子性, 多個進程同時調用send給向同一個TCP連接發送數據,不會發生數據混亂
  • 長度限制
    • 如果數據大小超過2M, 應將文件寫入臨時文件, 然後通過sendfile接口進行發送
    • 通過設置buffer_output_size參數可以修改發送長度限制
    • 在發送超過8k的數據時, 底層會啓用worker進程的共享內存, 需要進行一次Mutex->lock操作

sendfile

未完待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章