swoole入門教程04-多端口監聽、熱重啓以及Timer進階:簡單crontab

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

Github鏈接:https://github.com/LinkedDestiny/swoole-doc


1.多端口監聽

在實際運用場景中,服務器可能需要監聽不同host下的不同端口。比如,一個應用服務器,可能需要監聽外網的服務端口,同時也需要監聽內網的管理端口。在Swoole中,可以輕鬆的實現這樣的功能。 Swoole提供了addlistener函數用於給服務器添加一個需要監聽的host及port,並指定對應的Socket類型(TCP,UDP,Unix Socket以及對應的IPv4和IPv6版本)。 代碼如下:

$serv = new swoole_server("192.168.1.1", 9501); // 監聽外網的9501端口
$serv->addlistener("127.0.0.1", 9502 , SWOOLE_TCP); // 監聽本地的9502端口
$serv->start(); // addlistener必須在start前調用

此時,swoole_server就會同時監聽兩個host下的兩個端口。這裏要注意的是,來自兩個端口的數據會在同一個onReceive中獲取到,這時就要用到swoole的另一個成員函數connection_info,通過這個函數獲取到fd的from_port,就可以判定消息的類型。

$info = $serv->connection_info($fd, $from_id);
//來自9502的內網管理端口
if($info['from_port'] == 9502) {
    $serv->send($fd, "welcome admin\n");
}
//來自外網
else {
    $serv->send($fd, 'Swoole: '.$data);
}

點此查看完整源碼

2.服務器熱重啓

所謂熱重啓,就是當服務器相關代碼有所變動之後,無需停止服務,而是在服務器仍然運行的狀態下更新文件。Swoole通過內置的reload函數以及兩個自定義信號量實現了這一功能。 首先我講解一下Swoole可用的三個信號:SIGTERM,SIGUSR1,SIGUSR2。SIGTERM用於停止服務器,SIGUSR1用於重啓全部的Worker進程,SIGUSR2用於重啓全部的Task Worker進程。 那要如何實現熱更新代碼文件呢?Swoole的回調函數中有這個一個回調onWorkerStart;該回調會在Worker進程啓動時被調用。因此,當swoole_server收到SIGUSR1信號並重啓全部Worker進程後,onWorkerStart就會被調用。如果在onWorkerStart中require全部的代碼文件,每次onWorkerStart後都會重新require一次php文件,這樣就能實現代碼文件的熱更新。 來看下代碼實現:

    public function onStart( $serv ) {
        cli_set_process_title("reload_master");
    }
    public function onWorkerStart( $serv , $worker_id) {
        require_once "reload_page.php";
        Test(); // reload_page.php中定義的一個函數
    }

首先,在onStart回調函數中通過php的cli_set_process_title函數設置進程名。 在onWorkerStart中,require相關的php文件。 然後,新建一個reload.sh文件,輸入如下內容:

echo "Reloading..."
cmd=$(pidof reload_master)

kill -USR1 "$cmd"
echo "Reloaded"

這樣,就可以通過執行這個腳本重啓服務器了。 點此查看完整源碼

3.Timer補充:after函數

在swoole-1.7.7stable版本中,Timer新增了一個函數after。該函數的作用是在指定的時間間隔後執行回調函數,並且只執行一次。 這個函數可以彌補Timer本身做不到或者做起來很難的一些定時工作。 代碼如下:

$serv->after( 1000 , array($this, 'onAfter') , $str );

這裏指定在1000ms後,執行onAfter回調函數,函數參數爲$str。 舉個例子,比如服務器要求在收到某個請求後,在30S後向所有用戶發起推送。這樣的需求就可以直接用after函數來實現。 點此查看完整源碼

4.Timer進階:簡易crontab

未完成,後續會補充更新。(表示用Timer很簡單,但是怎麼解析Crontab命令完全沒頭緒……求大神指導……)

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