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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # dispatch_func 設置`dispatch`函數,`swoole`底層了內置了`5`種`dispatch_mode`,如果仍然無法滿足需求。可以使用編寫`C++`函數或`PHP`函數,實現`dispatch`邏輯。使用方法: ```php $serv->set(array( 'dispatch_func' => 'my_dispatch_function', )); ``` * 設置`dispatch_func`后底層會自動忽略`dispatch_mode`配置 * `dispatch_func`對應的函數不存在,底層將拋出致命錯誤 * 如果需要`dispatch`一個超過`8K`的包,`dispatch_func`只能獲取到 `0-8180` 字節的內容 > `dispatch_func`在`1.9.7`或更高版本可用 > `dispatch_func`在`1.9.18`或更高版本可以設置為`PHP`函數 > `dispatch_func`僅在`SWOOLE_PROCESS`模式下有效,`UDP/TCP/UnixSocket`均有效 編寫PHP函數 ---- 由于`ZendVM`無法支持多線程環境,即使設置了多個`Reactor`線程,同一時間只能執行一個`dispatch_func`。因此底層在執行此`PHP`函數時會進行加鎖操作,可能會存在鎖的爭搶問題。請勿在`dispatch_func`中執行任何阻塞操作,否則會導致`Reactor`線程組停止工作。 ```php $serv->set(array( 'dispatch_func' => function ($serv, $fd, $type, $data) { var_dump($fd, $type, $data); return intval($data[0]); }, )); ``` * `$fd`為客戶端連接的唯一標識符,可使用`Server::getClientInfo`獲取連接信息 * `$type`數據的類型,`0`表示來自客戶端的數據發送,`4`表示客戶端連接關閉,`5`表示客戶端連接建立 * `$data`數據內容,需要注意:如果啟用了`Http`、`EOF`、`Length`等協議處理參數后,底層會進行包的拼接。但在`dispatch_func`函數中只能傳入數據包的前`8K`內容,不能得到完整的包內容。 * 必須返回一個`[0-serv->worker_num)`的數字,表示數據包投遞的目標工作進程ID * 小于`0`或大于等于`serv->worker_num`為異常目標ID,`dispatch`的數據將會被丟棄 編寫C++函數 ---- 在其他PHP擴展中,使用`swoole_add_function`注冊長度函數到`Swoole`引擎中。 > C++函數調用時底層不會加鎖,需要調用方自行保證線程安全性 ```cpp int dispatch_function(swServer *serv, swConnection *conn, swEventData *data); int dispatch_function(swServer *serv, swConnection *conn, swEventData *data) { printf("cpp, type=%d, size=%d\n", data->info.type, data->info.len); return data->info.len % serv->worker_num; } int register_dispatch_function(swModule *module) { swoole_add_function("my_dispatch_function", (void *) dispatch_function); } ``` * `dispatch`函數必須返回投遞的目標worker進程id * 返回的`worker_id`不得超過`serv->worker_num`,否則底層會拋出段錯誤 * 返回負數(`return -1`)表示丟棄此數據包 * `data`可以讀取到事件的類型和長度 * `conn`是連接的信息,如果是`UDP`數據包,`conn`為`NULL`
                  <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>

                              哎呀哎呀视频在线观看