<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國際加速解決方案。 廣告
                # onReceive [TOC] 接收到數據時回調此函數,發生在worker進程中。函數原型: ~~~ function onReceive(swoole_server $server, int $fd, int $reactor_id, string $data); ~~~ * `$server`,`Server`對象 * `$fd`,`TCP`客戶端連接的唯一標識符 * `$reactor_id`,`TCP`連接所在的`Reactor`線程`ID` * `$data`,收到的數據內容,可能是文本或者二進制內容 > 關于`$fd`和`$reactor_id`[詳細的解釋](回調函數中的reactor_id和fd.md) > 未開啟自動協議選項,`onReceive`單次收到的數據最大為`64K` > 開啟了自動協議處理選項,`onReceive`將收到完整的數據包,最大不超過[package\_max\_length](package\_max\_length.md) > 支持二進制格式,`$data`可能是二進制數據 ## 關于TCP協議下包完整性 * 使用底層提供的`open_eof_check`/`open_length_check`/`open_http_protocol`,可以保證數據包的完整性 * 不使用底層的協議處理,在`onReceive`后`PHP`代碼中自行對數據分析,合并/拆分數據包。 例如:代碼中可以增加一個`$buffer = array()`,使用`$fd`作為`key`,來保存上下文數據。 每次收到數據進行字符串拼接,`$buffer[$fd] .= $data`,然后在判斷`$buffer[$fd]`字符串是否為一個完整的數據包。 默認情況下,同一個`fd`會被分配到同一個`Worker`中,所以數據可以拼接起來。**使用`dispatch_mode = 3`時。 請求數據是搶占式的,同一個fd發來的數據可能會被分到不同的進程。所以無法使用上述的數據包拼接方法** 關于粘包問題,如`SMTP`協議,客戶端可能會同時發出`2`條指令。在`Server`中可能一次性收到,這時應用層需要自行拆包。`SMTP`是通過`\r\n`來分包的,所以業務代碼中需要`explode("\r\n", $data)`來拆分數據包。 如果是請求應答式的服務,無需考慮拆分數據的問題。原因是客戶端在發起一次請求后,必須等到服務器端返回當前請求的響應數據,才會發起第二次請求,不會同時發送`2`個請求。 ## 多端口監聽 當主服務器設置了協議后,額外監聽的端口默認會繼承主服務器的設置。需要顯式調用`set`方法來重新設置端口的協議。 ~~~ $serv = new Swoole\Http\Server("127.0.0.1", 9501); $port2 = $serv->listen('127.0.0.1', 9502, SWOOLE_SOCK_TCP); $port2->on('receive', function (Swoole\Server $serv, $fd, $reactor_id, $data) { echo "[#".$serv->worker_id."]\tClient[$fd]: $data\n"; }); ~~~ 這里雖然調用了`on`方法注冊了`onReceive`回調函數,但由于沒有調用`set`方法覆蓋主服務器的協議,新監聽的`9502`端口依然使用`Http`協議。使用`telnet`客戶端連接`9502`端口發送字符串時服務器不會觸發`onReceive`。
                  <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>

                              哎呀哎呀视频在线观看