onReceive
이 함수를 콜백하고, 이는 작업자 프로세스에서 발생합니다. 함수 프로토타입: (권장 학습: swoole 비디오 튜토리얼 )
function onReceive(swoole_server $server, int $fd, int $reactor_id, string $data);
$server, 서버 객체
$fd, TCP 클라이언트 최종 연결의 고유 식별자
$reactor_id, TCP 연결이 위치한 Reactor 스레드 ID
$data, 수신된 데이터 콘텐츠는 텍스트 또는 바이너리 콘텐츠일 수 있습니다# 🎜🎜 #
$fd 및 $reactor_id에 대한 자세한 설명
자동 프로토콜 옵션이 켜지지 않은 경우 onReceive가 한 번에 수신하는 최대 데이터는 is 64K자동 프로토콜 처리 옵션이 켜져 있으면 onReceive는 최대 package_max_length 바이너리 형식을 지원하며 $data는 바이너리 데이터일 수 있음# 🎜🎜#
기본 레이어에서 제공하는 open_eof_check/open_length_check/open_http_protocol을 사용하면 데이터 패킷의 무결성을 보장할 수 있습니다.
기본 프로토콜 처리를 사용하지 마세요. , onReceive 후 PHP 코드에서 데이터를 직접 분석하고 패킷을 병합/분할합니다.
예를 들어 $buffer = array()를 코드에 추가하고 $fd를 키로 사용하여 컨텍스트 데이터를 저장할 수 있습니다. 데이터가 수신될 때마다 스트링 스플라이싱($buffer[$fd] .= $data)을 수행한 후 $buffer[$fd] 스트링이 완전한 데이터 패킷인지 여부를 판단합니다.
기본적으로 동일한 fd가 동일한 Worker에 할당되므로 데이터를 서로 이어붙일 수 있습니다. Dispatch_mode = 3을 사용하는 경우.
데이터 요청은 선제적이며 동일한 fd에서 전송된 데이터가 다른 프로세스에 할당될 수 있습니다. 따라서 위의 데이터 패킷 스플라이싱 방법은 사용할 수 없습니다.
SMTP 프로토콜과 같은 끈적한 패킷 문제의 경우 클라이언트는 동시에 2개의 명령을 내릴 수 있습니다. 서버에서 한꺼번에 수신될 수 있으며, 이 경우 애플리케이션 계층에서 자체적으로 압축을 풀어야 합니다. SMTP는 rn을 통해 하청계약을 맺기 때문에 데이터 패킷을 분할하려면 비즈니스 코드에explore("rn", $data)가 필요합니다.
요청-응답 서비스라면 데이터 분할 문제를 고려할 필요가 없습니다. 그 이유는 클라이언트가 요청을 시작한 후 두 번째 요청을 시작하기 전에 서버가 현재 요청의 응답 데이터를 반환할 때까지 기다려야 하기 때문입니다.
위 내용은 swoole의 onreceive가 트리거되지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!