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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # onReceive 接收到數據時回調此函數,發生在worker進程中。函數原型: ```php function onReceive(swoole_server $server, int $fd, int $reactor_id, string $data); ``` * `$server`,swoole_server對象 * `$fd`,TCP客戶端連接的唯一標識符 * `$reactor_id`,TCP連接所在的Reactor線程ID * `$data`,收到的數據內容,可能是文本或者二進制內容 > 關于$fd和$reactor_id [詳細的解釋](https://wiki.swoole.com/wiki/page/56.html) > 未開啟swoole的自動協議選項,`onReceive`回調函數單次收到的數據最大為64K > Swoole支持二進制格式,$data可能是二進制數據 協議相關說明 ----- * UDP協議,onReceive可以保證總是收到一個完整的包,最大長度不超過64K * UDP協議下,`$fd`參數是對應客戶端的IP,`$reactor_id`是客戶端的端口和來源端口; 客戶端ip等于long2ip(unpack('N',pack('L',$fd))[1]); * TCP協議是流式的,`onReceive`無法保證數據包的完整性,可能會同時收到多個請求包,也可能只收到一個請求包的一部分數據 * swoole只負責底層通信,$data是通過網絡接收到的原始數據。對數據解包打包需要在PHP代碼中自行實現 > 如果開啟了eof_check/length_check/http_protocol,$data的長度可能會超過64K,但最大不超過$server->setting['package_max_length'] > 注意,onReceive回調不再支持UDP Server 關于TCP協議下包完整性 ------- * 使用swoole提供的open_eof_check/open_length_check/open_http_protocol,可以保證數據包的完整性 * 不使用swoole的協議處理,在onReceive后PHP代碼中自行對數據分析,合并/拆分數據包。 例如:代碼中可以增加一個 $buffer = array(),使用$fd作為key,來保存上下文數據。 每次收到數據進行字符串拼接,$buffer[$fd] .= $data,然后在判斷$buffer[$fd]字符串是否為一個完整的數據包。 默認情況下,同一個fd會被分配到同一個worker中,所以數據可以拼接起來。__使用dispatch_mode = 3時。 請求數據是搶占式的,同一個fd發來的數據可能會被分到不同的進程。所以無法使用上述的數據包拼接方法__ 關于粘包問題,如SMTP協議,客戶端可能會同時發出2條指令。在swoole中可能是一次性收到的,這時應用層需要自行拆包。smtp是通過\r\n來分包的,所以業務代碼中需要 explode("\r\n", $data)來拆分數據包。 如果是請求應答式的服務,無需考慮粘包問題。原因是客戶端在發起一次請求后,必須等到服務器端返回當前請求的響應數據,才會發起第二次請求,不會同時發送2個請求。 多端口監聽 ---- 當主服務器設置了協議后,額外監聽的端口默認會繼承主服務器的設置。需要顯式調用`set`方法來重新設置端口的協議。 ```php $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>

                              哎呀哎呀视频在线观看