<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>

                # 控制器-Controller Controller需要遵循的規則: 1.控制器需要繼承Controller類。 2.控制器里所有public方法都是公開給外界訪問的,private和protected定義的方法無法被外界訪問。 3.控制器里的方法需要搭配前綴名,具體的前綴名的定義在ports.php配置中。 4.控制器采用了對象池復用技術,需要注意調用destroy()方法,否則會產生內存泄露。 >特別聲明:從3.1.1版本起destroy方法會自動調用,無需手動書寫。 ## initialization 初始化方法,Controller是對象池復用模式,所以不要在__construct中進行初始化,通過重寫initialization方法實現Controller的初始化,每次路由到Controller中時都會執行initialization方法。 ```php class AppController extends Controller { /** * @var AppModel */ public $AppModel; protected function initialization($controller_name, $method_name) { parent::initialization($controller_name, $method_name); $this->AppModel = $this->loader->model('AppModel', $this); throw new \Exception("錯誤"); } } ``` 可以在initialization中進行loader操作,也可以進行細節的檢查,如果想中斷操作直接拋出異常即可,會直接進入異常處理函數,不會執行后面的方法。 >特別聲明:從3.1.1版本起增加了interrupt方法專門用于中斷 ## interrupt 3.1.1版本新增方法 中斷,調用此方法Controller立馬進入銷毀,后面的代碼一概不會執行。 ``` protected function initialization($controller_name, $method_name) { parent::initialization($controller_name, $method_name); $this->AppModel = $this->loader->model('AppModel', $this); $this->interrupt(); } ``` ## defaultMethod 當控制器方法不存在的時候的默認方法,開發者可以重寫此方法作為默認方法 ## onExceptionHandle onExceptionHandle 異常的回調,當Controller方法中出現異常會轉到這個回調方法中,開發者可以自定義異常的處理和輸出。 >在任何方法中包括調用的Model,Task拋出異常最終都會中斷流程,并且流入到onExceptionHandle方法中 ## HTTP 列舉下對應的配置 port.php ``` $config['ports'][] = [ 'socket_type' => PortManager::SOCK_HTTP, 'socket_name' => '0.0.0.0', 'socket_port' => 8081, 'route_tool' => 'NormalRoute', 'middlewares' => ['MonitorMiddleware', 'NormalHttpMiddleware'], 'method_prefix' => 'http_' ]; ``` ports配置中配置了8081端口為HTTP協議,路由使用了NormalRoute路由,中間件使用了MonitorMiddleware和NormalHttpMiddleware,方法前綴為'http_'。 關于路由和中間件,請看相應的文檔,這里我們對應下url和目標Controller的關系。 URL:http://localhost:8081/TestController/echo Controller文件:將會優先尋找app/Controllers/TestController.php,如果找不到會尋找框架里的Server/Controllers/TestController.php >在server.php配置中有個allow_ServerController參數,如果為false將不能訪問到框架自帶的控制器,Controller,Model,Task,Middlewares,Route,Pack均會優先從app目錄下匹配。 由于設置了method_prefix,那么我們訪問的方法就是TestController類中的http_echo。 我們接下來看看http_echo方法,代碼如下: ```php public function http_echo() { $this->http_output->end(123); } ``` 通過$this->http_output->end方法進行輸出,通過游覽器訪問可以看到123的字樣。 >end方法只能調用一次,多次調用無效。 通過$this->http_output可以獲取到HttpOutPut類,里面有相應的API,這里不多做介紹。 相應的通過$this->http_input可以獲取到HttpInPut類。 ``` public function http_test() { $max = $this->http_input->get('max'); if (empty($max)) { $max = 100; } $sum = 0; for ($i = 0; $i < $max; $i++) { $sum += $i; } $this->http_output->end($sum); } ``` 這里通過$this->http_input->get方法獲取到了max的值。 訪問的URL為http://localhost:8081/TestController/test?max=10 將輸出45. * redirect Http重定向 * redirect404 重定向到404 * redirectController 重定向到控制器,這里的方法名不填前綴 ## TCP 列舉下對應的配置 port.php ``` $config['ports'][] = [ 'socket_type' => PortManager::SOCK_TCP, 'socket_name' => '0.0.0.0', 'socket_port' => 9091, 'pack_tool' => 'LenJsonPack', 'route_tool' => 'NormalRoute', 'middlewares' => ['MonitorMiddleware'] ]; ``` 這里開啟了9091端口作為TCP協議,封裝器使用了LenJsonPack,路由器使用了NormalRoute,中間件為MonitorMiddleware,大家先不要對這么多名稱感到恐懼,我們后面慢慢來了解。 HTTP協議是個完整的業務層協議所以他不需要封裝器的支持,只需要進行路由,但TCP協議不同一般我們會在TCP協議上再構建一個私有的協議,這時我們就需要封裝器了。具體的封裝器我們以后詳細說明,現在我們假定我們通過了路由將消息轉發到了對應的控制器方法上了。 這里沒有設置前綴所以我們直接路由到對應的方法上。 ``` /** * tcp的測試 */ public function testTcp() { var_dump($this->client_data->data); $this->send($this->client_data->data); } ``` 通過$this->client_data可以獲取到數據流通過封裝器解包后的完整數據,NormalRoute中我們定義client_data的結構如下 ``` stdClass{ controller_name:控制器名稱 method_name:方法名稱 path:路徑(非必須) params:方法參數(非必須) *:等等其他自定義字段 } ``` client_data是個object不是一個array這點需要注意,數據流通過封裝器解包后傳遞給路由器,路由器需要controller_name和method_name,如果滿足條件將進行路由。 上面的代碼將獲取到的$this->client_data->data返回給了客戶端。 返回的數據將又一次經過端口設置的封裝器,封裝成協議支持的格式返回給客戶端。 ```php public function testTcp() { $this->send($this->client_data->data)); //發送第一條 $this->send($this->client_data->data)); //發送第二條 } ``` send系列方法被用于長連接(tcp,ws,wss)發送消息。 * send 向當前客戶端發送消息 * sendToUid 向指定uid發送消息 * sendToUids 向指定uids發送消息 * sendToAll 向所有綁定uid的連接發送消息 * bindUid 為當前連接綁定uid * kickUid 踢用戶下線 * addSub 添加訂閱 * removeSub 移除訂閱 * sendPub 發布訂閱 * getFdInfo 獲取fd的信息 ## WebSocket 和TCP基本一致,貼一下對應的配置 ``` $config['ports'][] = [ 'socket_type' => PortManager::SOCK_WS, 'socket_name' => '0.0.0.0', 'socket_port' => 8083, 'route_tool' => 'NormalRoute', 'pack_tool' => 'NonJsonPack', 'opcode' => PortManager::WEBSOCKET_OPCODE_TEXT, 'middlewares' => ['MonitorMiddleware', 'NormalHttpMiddleware'] ]; ``` opcode是WebSocket獨有的,有2個選項 PortManager::WEBSOCKET_OPCODE_TEXT 文本流 PortManager::WEBSOCKET_OPCODE_BINARY 二進制流 其中還需要注意下封裝器使用的是NonJsonPack,NonJsonPack和LenJsonPack區別在于NonJsonPack沒有長度信息,因為ws協議也是一個相對上層的協議不要手動分割數據流。
                  <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>

                              哎呀哎呀视频在线观看