socket_set_block 은 PHP 소켓 확장에서 소켓을 차단 모드로 설정하기 위해 제공하는 기능입니다.
bool socket_set_block ( resource $socket )
차단 모드는 Socket_read , Socket_write 등과 같은 기능 호출을 의미합니다. 데이터를 읽거나 서면 할 때까지 블록 실행.
차단 모드에서 프로그램은 함수 호출에 실속되어 응용 프로그램이 응답하지 않을 수 있습니다.
행동 차단 행동을 이해하면 교착 상태 나 오랫동안 기다리는 문제를 찾는 데 도움이됩니다.
데이터의 실제 전송 및 수신 프로세스를 마스터하고 네트워크 통신의 정확성을 보장하는 것이 편리합니다.
차단 모드는 기본적으로 무한히 대기하지만 소켓의 시간 초과 설정과 일치하는 데 사용하여 대기 시간을 제한하여 프로그램의 영구 차단을 피할 수 있습니다.
// 읽기 시간 초과를 설정하십시오5두번째,시간 초과를 작성하십시오5두번째
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 5, 'usec' => 0]);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ['sec' => 5, 'usec' => 0]);
각 키 소켓 작동 전후 로그 인쇄하여 프로그램이 차단되는 단계를 결정하는 데 도움이됩니다.
echo "데이터를 읽을 준비가되었습니다...\n";
$data = socket_read($socket, 1024);
if ($data === false) {
echo "읽지 못했습니다,실수:" . socket_strerror(socket_last_error($socket)) . "\n";
} else {
echo "성공적으로 읽으십시오,콘텐츠:" . $data . "\n";
}
차단 모드에서 소켓이 작동 할 수 있는지 확실하지 않은 경우 먼저 socket_select를 사용하여 상태를 결정할 수 있습니다.
$read = [$socket];
$write = null;
$except = null;
$tv_sec = 10; // 10두번째타임 아웃
$result = socket_select($read, $write, $except, $tv_sec);
if ($result === false) {
echo "select 오류가 발생했습니다:" . socket_strerror(socket_last_error()) . "\n";
} elseif ($result === 0) {
echo "select 타임 아웃,읽을 데이터가 없습니다\n";
} else {
echo "socket 읽을 수 있습니다,데이터를 읽을 준비가되었습니다\n";
$data = socket_read($socket, 1024);
echo "读取콘텐츠:" . $data . "\n";
}
다음 예제는 클라이언트 소켓을 만들고, 차단 모드를 설정하고, 타임 아웃과 로그를 결합하고, 소켓의 읽기 및 쓰기 동작을 디버깅하는 방법을 보여줍니다.
<?php
// 만들다 TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create 실패하다: " . socket_strerror(socket_last_error()) . "\n");
}
// 서버에 연결하십시오(여기에 사용됩니다 gitbox.net 예제 도메인 이름)
$server = 'gitbox.net';
$port = 80;
if (!socket_connect($socket, $server, $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");
}
echo "차단 모드가 설정되었습니다\n";
// 设置接收타임 아웃5두번째,무한한 막힘을 피하십시오
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 5, 'usec' => 0]);
// 보내다 HTTP GET 묻다
$request = "GET / HTTP/1.1\r\nHost: $server\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request);
echo "묻다已보내다,응답을 읽기 시작하십시오...\n";
// 응답 데이터를 읽습니다
$response = '';
while (true) {
$buf = socket_read($socket, 2048);
if ($buf === false) {
echo "读取실수: " . socket_strerror(socket_last_error($socket)) . "\n";
break;
} elseif ($buf === '') {
// 연결을 원격으로 닫습니다
echo "원격 연결이 닫힙니다\n";
break;
}
$response .= $buf;
}
echo "响应콘텐츠:\n";
echo $response;
socket_close($socket);
?>
socket_set_block 으로 차단 모드를 설정하면 읽기 및 쓰기 기능이 완료되거나 오류가 발생할 때까지 대기합니다.
시간 초과 설정과 로그 출력을 결합하면 교착 상태를 효과적으로 피하고 디버깅을 도울 수 있습니다.
Socket_Select를 사용하여 소켓 상태를 결정하면 디버깅 및 제어 기능이 향상 될 수 있습니다.
실제로,보다 핵심 단계 정보를 인쇄하고 차단 지점을 분석하는 것이 문제를 해결하는 데 핵심입니다.
위의 방법을 통해 네트워크 통신의 안정성과 신뢰성을 보장하기 위해 차단 모드의 소켓 거동을 효과적으로 디버깅 할 수 있습니다.