首頁  >  文章  >  php框架  >  swoole的onreceive不觸發

swoole的onreceive不觸發

(*-*)浩
(*-*)浩原創
2019-12-14 14:13:012512瀏覽

swoole的onreceive不觸發

onReceive

#接收到資料時回呼此函數,發生在worker進程中。 函數原型:          (建議學習: swoole視訊教學

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 詳細的解釋

未開啟自動協定選項,onReceive單次收到的資料最大為64K

開啟了自動協定處理選項,onReceive將收到完整的資料包,最大不超過package_max_length

支援二進位格式,$data可能是二進位資料

使用底層提供的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個請求

以上是swoole的onreceive不觸發的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn