php를 사용하여 네트워크를 프로그래밍 할 때 Socket_set_block () 및 socket_set_nonblock () 은 소켓이 차단 또는 비 블로킹 모드에서 작동하는지 여부를 제어하는 두 가지 매우 중요한 기능입니다. 이 두 모드를 합리적으로 전환하면 네트워크 I/O를보다 유연하게 처리하고 프로그램 효율성과 대응 성을 향상시키는 데 도움이됩니다.
차단 모드 (기본값) :이 모드에서는 소켓 작동 (예 : Socket_read () , Socket_Accept () 등)가 데이터를 읽을 수 있거나 연결이 완료 될 때까지 대기합니다. 이 방법은 쓰기가 간단하지만 동시성이 높은 시나리오에서는 스레드 또는 프로세스 막힘이 발생하여 전반적인 성능을 줄일 수 있습니다.
비 블로킹 모드 : 반대로 비 블로킹 모드의 소켓 작동이 즉시 반환됩니다. 작업을 즉시 완료 할 수없는 경우 (읽을 데이터가없는 경우) 함수는 False를 반환하고 ERGAIN 또는 EWOULDBLOCK 으로 오류 코드를 설정합니다.
다음은 차단 상태와 비 블로킹 상태 사이를 전환하고 응용 프로그램 시나리오와 함께 사용하는 방법을 보여주는 간단한 예입니다.
<?php
$host = 'gitbox.net';
$port = 8080;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create() failed: " . socket_strerror(socket_last_error()));
}
// 비 블로킹 모드로 설정합니다,연결하려고 노력하십시오
socket_set_nonblock($socket);
$connected = @socket_connect($socket, $host, $port);
if (!$connected) {
$err = socket_last_error($socket);
if ($err !== SOCKET_EINPROGRESS && $err !== SOCKET_EALREADY) {
die("socket_connect() failed: " . socket_strerror($err));
}
}
// 사용 select 연결이 성공했는지 확인하십시오
$write = [$socket];
$null = [];
if (socket_select($null, $write, $null, 5) > 0) {
// 차단 모드로 다시 전환하십시오,후속 데이터 전송 및 수신에 사용됩니다
socket_set_block($socket);
// 데이터 보내기 및 수신을 시작하십시오
socket_write($socket, "GET / HTTP/1.1\r\nHost: $host\r\n\r\n");
$response = socket_read($socket, 2048);
echo "Response: " . $response;
} else {
die("Connection timeout or failed");
}
socket_close($socket);
?>
비 블로킹 연결 : Socket_Set_NonBlock ()을 사용하여 연결 작동이 프로그램 실행 차단을 방지하지 못합니다.
Socket_select ()를 사용하여 소켓이 쓸 수있을 때까지 기다립니다 . 이는 연결이 성공적인지 여부를 감지하는 일반적인 트릭입니다.
차단 모드로 다시 전환하십시오 : Socket_set_Block ()을 사용하여 연결이 설정된 직후에 차단 모드로 다시 전환하여 후속 데이터 상호 작용을 용이하게합니다.
요청 및 읽기 응답 보내기 : 현재 소켓은 차단 모드에서 작동하여 전체 서버 응답을 읽을 수 있습니다.
다중 연결 요청이 신속하게 시작 해야하는 경우 비 차단 모드 사용;
시간 초과 제어와 같이 특정 작업이 무한히 대기하지 않도록해야합니다.
연결 또는 특정 단계를 완료 한 후 블록 모드로 다시 전환하여 코드 처리 로직을 단순화하십시오.
비 블로킹 모드에서 모든 소켓 작업은 오류 확인을 받아야합니다.
socket_select () 는 비 차단 소켓 프로그래밍의 핵심 도구입니다.
스위칭 모드는 정적이 아닌 작동 단계에 따라 수행해야합니다.
PHP 소켓 프로그래밍은 차단 및 비 블로킹 모드를 합리적으로 전환함으로써 성능과 안정성을 고려할뿐만 아니라 복잡한 네트워크 통신 요구에 더 잘 대응할 수 있습니다.