기본적으로 PHP의 소켓은 차단 모드에 있으므로 연결이 성공하거나 반환되지 않을 때까지 Socket_Connect 호출이 차단됩니다. 그러나 연결 후 후속 읽기 및 쓰기 작업이 차단 된 상태를 유지하려면 Socket_set_Block을 사용하여 명시 적으로 설정할 수 있습니다.
socket_connect 후에 socket_set_block을 호출해야합니다. 왜냐하면:
연결하기 전에 차단 모드 설정 Socket_Connect 에 의해 재설정 될 수 있습니다.
연결 후 설정을 통해 모든 후속 작업이 차단 모드에 있는지 확인합니다.
연결이 성공한 후 Socket_set_Block을 호출하는 방법을 보여주는 완전한 예는 다음과 같습니다.
<?php
// a TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create 실패하다: " . socket_strerror(socket_last_error()) . "\n");
}
// 서버에 연결하십시오
$address = 'gitbox.net';
$port = 80;
if (!socket_connect($socket, $address, $port)) {
die("socket_connect 실패하다: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// 성공적인 연결 후,차단 모드를 설정하십시오
if (!socket_set_block($socket)) {
die("socket_set_block 실패하다: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// 지금 socket 차단되었습니다,읽기 및 쓰기 작업을 수행 할 수 있습니다
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));
// 응답을 읽으십시오
$response = '';
while ($out = socket_read($socket, 2048)) {
$response .= $out;
}
// 폐쇄 socket
socket_close($socket);
// 출력 응답
echo $response;
?>
Socket_connect가 연결 실패 후 설정을 피하기 위해 Socket_set_Block 이 호출되는지 확인하십시오.
socket_set_block 부울 값을 반환하고 실패하면 Socket_last_error를 통해 오류 메시지를 얻을 수 있습니다.
연결하기 전에 socket_set_block을 호출하면 연결 중에 내부 통화로 덮어 쓰기가 잘못 차단 설정이 발생할 수 있습니다.
PHP의 기본 소켓 모드는 일반적으로 차단되지만 일부 시나리오 (예 : 이전에 호출 된 Socket_set_nonblock )에서는 차단으로 다시 재설정해야합니다.
요약하면, 차단 모드가 적용되도록하려면 Socket_Connect가 성공한 후 Socket_set_block을 호출하여 후속 읽기 및 쓰기 작업이 차단 방식으로 수행되도록하여 데이터를 읽을 수 없거나 비 블로킹 모드에서 쓰기 실패와 같은 일반적인 문제를 피하는 것입니다.