WebSocket 기술은 양방향 실시간 커뮤니케이션으로 인해 온라인 채팅, 실시간 푸시, 게임 상호 작용 및 기타 시나리오에 널리 사용됩니다. PHP를 사용하여 WebSocket 서비스를 구축 할 때 네트워크 통신의 성능과 안정성이 핵심이됩니다. PHP 소켓 프로그래밍에서 중요한 도구 인 Socket_set_Block 함수는 소켓의 차단 및 비 블로킹 상태를 효과적으로 제어하여 WebSocket 서비스의 응답 속도 및 리소스 활용을 최적화 할 수 있습니다.
이 기사는 실제 프로젝트 경험을 결합하여 WebSocket Service에서 Socket_set_Block 함수를 효율적으로 사용하는 방법을 자세히 설명하고 실용적인 기술을 공유합니다.
socket_set_block은 소켓이 차단 모드인지 여부를 설정하기 위해 PHP가 제공하는 함수입니다. 차단 모드에서는 소켓 작업 (예 : 읽기 또는 쓰기)이 반환하기 전에 작업이 완료되기를 기다립니다. 비 블로킹 모드에서는 작업이 즉시 반환되며 데이터를 사용할 수없는 경우 오류가 반환됩니다.
<?php
// 설정 socket 차단 모드에서
socket_set_block($socket);
// 설정 socket 비 블로킹 모드에서
socket_set_nonblock($socket);
?>
WebSocket Services에서는 차단 및 비 차단 선택이 성능에 큰 영향을 미칩니다.
차단 모드 <br> 간단한 시나리오에 적합한 코드 흐름은 직관적이지만 프로세스 지연이 발생할 수 있습니다. 특히 클라이언트가 천천히 응답 할 때 서버는 연결에 의해 "드래그"될 수 있습니다.
비 블로킹 모드 <br> 서버가 즉시 반환하고 다른 작업을 계속 처리 할 수 있으며,이 작업은 고도로 및 다중 연결 환경에 더 적합합니다. 그러나 프로그래밍 복잡성이 증가하고 폴링 ( Socket_Select ) 또는 이벤트 중심 모델을 결합해야합니다.
실제 프로젝트에서 내 경험은 "Flexible Switch"전략을 채택하는 것입니다.
연결 설정 단계 : 연결 핸드 셰이크가 안정적으로 완료되도록 소켓을 블록으로 설정합니다.
데이터 전송 단계 : 블로킹을하지 않은 상태로 전환하고 Socket_Select를 폴링하여 여러 연결을 듣고 차단으로 인한 성능 병목 현상을 피하십시오.
샘플 코드 스 니펫 :
<?php
$serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($serverSocket, '0.0.0.0', 9501);
socket_listen($serverSocket);
socket_set_block($serverSocket);
while (true) {
$clientSocket = socket_accept($serverSocket);
if ($clientSocket !== false) {
// 악수를 완성하십시오,설정非阻塞模式,비동기 처리를 시작하십시오
socket_set_nonblock($clientSocket);
// 할 것이다 $clientSocket 클라이언트 목록에 추가하십시오,후속 적으로 사용하십시오 socket_select 거래하십시오
$clients[] = $clientSocket;
}
// 사용 socket_select 여러 고객의 말을 듣습니다,막힘을 피하십시오
$read = $clients;
$write = null;
$except = null;
if (socket_select($read, $write, $except, 0, 200000) > 0) {
foreach ($read as $readSocket) {
$data = socket_read($readSocket, 2048);
if ($data === false || $data === '') {
// 연결이 닫히거나 오류,리소스 정리
$index = array_search($readSocket, $clients);
unset($clients[$index]);
socket_close($readSocket);
} else {
// 거래하십시오 WebSocket 데이터 프레임
// ...
}
}
}
}
?>
장기 차단을 피하십시오 : 차단 모드에서 socket_read를 호출하십시오. 클라이언트가 응답하지 않으면 프로세스가 중단 될 수 있습니다. 타임 아웃 제어를 결합하거나 가능한 한 빨리 비 차단을 전환하는 것이 좋습니다.
Socket_Select의 합리적인 사용 : 비 블로킹 모드와 함께 서버는 많은 연결을 동시에 처리하고 처리량을 향상시킬 수 있습니다.
오류 처리가 자세히 설명해야합니다 . 비 블로킹 모드에서 Socket_read는 eagain 과 같은 오류 코드를 반환 할 수 있으며 판단 후 합리적으로 처리해야합니다.
메모리 관리 : 단절된 소켓을 닫아 메모리 누출을 방지하십시오.
PHP 공식 소켓 기능 매뉴얼
<code> https://gitbox.net/manual/en/function.socket-set-block.php </code>
WebSocket 프로토콜 표준 (RFC 6455)
<code> https://gitbox.net/rfc6455 </code>