<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                > 環境說明: 系統:Ubuntu14.04 (安裝教程包括CentOS6.5) > PHP版本:PHP-5.5.10 > swoole版本:1.7.7-stable ## **1.多端口監聽** 在實際運用場景中,服務器可能需要監聽不同host下的不同端口。比如,一個應用服務器,可能需要監聽外網的服務端口,同時也需要監聽內網的管理端口。在Swoole中,可以輕松的實現這樣的功能。 Swoole提供了[addlistener](https://github.com/LinkedDestiny/swoole-doc/blob/master/doc/03.swoole_server%E5%87%BD%E6%95%B0%E5%88%97%E8%A1%A8.md#swoole_serveraddlistener)函數用于給服務器添加一個需要監聽的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](https://github.com/LinkedDestiny/swoole-doc/blob/master/doc/03.swoole_server%E5%87%BD%E6%95%B0%E5%88%97%E8%A1%A8.md#swoole_serverconnection_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); } ~~~ [點此查看完整源碼](https://github.com/LinkedDestiny/swoole-doc/blob/master/src/04/swoole_multi_port_server.php) ## **2.服務器熱重啟** 所謂熱重啟,就是當服務器相關代碼有所變動之后,無需停止服務,而是在服務器仍然運行的狀態下更新文件。Swoole通過內置的reload函數以及兩個自定義信號量實現了這一功能。 首先我講解一下Swoole可用的三個信號:SIGTERM,SIGUSR1,SIGUSR2。SIGTERM用于停止服務器,SIGUSR1用于重啟全部的Worker進程,SIGUSR2用于重啟全部的Task Worker進程。 那要如何實現熱更新代碼文件呢?Swoole的回調函數中有這個一個回調[onWorkerStart](https://github.com/LinkedDestiny/swoole-doc/blob/master/doc/02.%E4%BA%8B%E4%BB%B6%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0.md#3onworkerstart);該回調會在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](https://github.com/LinkedDestiny/swoole-doc/blob/master/doc/02.%E4%BA%8B%E4%BB%B6%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0.md#2onstart)回調函數中通過php的cli_set_process_title函數設置進程名。 在[onWorkerStart](https://github.com/LinkedDestiny/swoole-doc/blob/master/doc/02.%E4%BA%8B%E4%BB%B6%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0.md#3onworkerstart)中,require相關的php文件。 然后,新建一個reload.sh文件,輸入如下內容: ~~~ echo "Reloading..." cmd=$(pidof reload_master) kill -USR1 "$cmd" echo "Reloaded" ~~~ 這樣,就可以通過執行這個腳本重啟服務器了。?[點此查看完整源碼](https://github.com/LinkedDestiny/swoole-doc/tree/master/src/04/reload) ## **3.Timer補充:after函數** 在swoole-1.7.7stable版本中,Timer新增了一個函數[after](https://github.com/LinkedDestiny/swoole-doc/blob/master/doc/03.swoole_server%E5%87%BD%E6%95%B0%E5%88%97%E8%A1%A8.md#swoole_serverafter)。該函數的作用是在指定的時間間隔后執行回調函數,并且只執行一次。 這個函數可以彌補Timer本身做不到或者做起來很難的一些定時工作。 代碼如下: ~~~ $serv->after( 1000 , array($this, 'onAfter') , $str ); ~~~ 這里指定在1000ms后,執行onAfter回調函數,函數參數為$str。 舉個例子,比如服務器要求在收到某個請求后,在30S后向所有用戶發起推送。這樣的需求就可以直接用after函數來實現。?[點此查看完整源碼](https://github.com/LinkedDestiny/swoole-doc/blob/master/src/04/swoole_after_server.php) ## **4.Timer進階:簡易crontab** 未完成
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看