네트워크 프로그래밍에 PHP를 사용하는 경우 Stream_Socket_RecvFrom 함수는 UDP 패킷을 수신하는 데 일반적으로 사용되는 기능입니다. 그러나 기본적 으로이 함수는 데이터를 수신하거나 오류가 발생할 때까지 데이터를 기다리는 동안 블록을 차단합니다. 일부 시나리오에서는 프로그램에 장기 일시 정지가 발생하여 성능 및 사용자 경험에 영향을 줄 수 있습니다. 이 긴 차단을 피하려면 읽기 시간 초과를 설정해야합니다.
이 기사는 Stream_Socket_RecvFrom 기능에서 읽기 시간 초과를 설정하는 방법을 자세히 설명하여 프로그램 동작을 더 잘 제어 할 수 있도록 도와줍니다.
stream_socket_recvfrom 함수의 기본 사용량은 다음과 같습니다.
$data = stream_socket_recvfrom($socket, 1024);
지정된 $ 소켓 에서 최대 1024 바이트의 데이터를 읽습니다. 데이터가 도착하지 않으면 함수가 차단되어 대기합니다.
stream_socket_recvfrom 이 호출되면 피어가 오랫동안 데이터를 보내지 않으면 프로그램이 대기하므로 네트워크 애플리케이션의 응답 속도와 안정성에 매우 유리합니다. 프로그램이 오랫동안 고정되는 것을 피하기 위해서는 시간 초과 메커니즘을 설정해야하며 시간 초과가 시작되면 읽기를 포기하고 다른 처리를 수행합니다.
PHP에서 작동 스트림 타임 아웃은 일반적으로 stream_set_timeout 함수를 통해 구현됩니다. 이 기능은 열린 스트림의 시간 초과 시간을 설정할 수 있습니다.
예:
// 만들다 UDP socket
$socket = stream_socket_server("udp://0.0.0.0:9999", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
die("无法만들다socket: $errstr ($errno)\n");
}
// 시간 초과 설정,초와 마이크로 초의 단위
// 这里시간 초과 설정时间为 5 두번째
stream_set_timeout($socket, 5);
// 읽기 기능을 호출합니다
$data = stream_socket_recvfrom($socket, 1024);
$info = stream_get_meta_data($socket);
if ($info['timed_out']) {
echo "데이터 시간 초과를 읽으십시오,기다리는 대기\n";
} else {
echo "수신 데이터: $data\n";
}
stream_set_timeout ($ socket, 5)는 5 초 타임 아웃을 설정합니다.
데이터를 읽은 후 Stream_get_Meta_Data ($ socket) 에 의해 타임 아웃이 달성되는지 여부를 결정하십시오.
시간 초과 메커니즘 외에도 또 다른 일반적인 관행은 소켓을 비 블로킹 모드로 설정 한 다음 폴링 또는 이벤트 중심 메커니즘과 함께 데이터를 읽는 것입니다.
// 만들다 socket
$socket = stream_socket_server("udp://0.0.0.0:9999", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
die("无法만들다socket: $errstr ($errno)\n");
}
// 비 블로킹 모드를 설정하십시오
stream_set_blocking($socket, false);
$startTime = time();
$timeout = 5; // 두번째
while (true) {
$data = stream_socket_recvfrom($socket, 1024);
if ($data !== false && $data !== '') {
echo "수신 데이터: $data\n";
break;
}
if (time() - $startTime > $timeout) {
echo "시간 초과를 읽으십시오,루프를 종료하십시오\n";
break;
}
// 피하다CPU너무 높은 점유,적절하게 자십시오
usleep(100000); // 100毫두번째
}
이 방법을 사용하면 읽기 논리를보다 유연하게 제어 할 수 있으며 이벤트 루프의 통합을 용이하게합니다.
Stream_Socket_Recvfrffffffffffffffffect 기본적으로 프로그램이 오랫동안 기다릴 수 있습니다.
Stream_set_timeout을 사용하여 시간이 너무 오래 차단되지 않도록 시간 초과 시간을 설정하십시오.
읽은 후 Stream_get_meta_data를 사용하여 시간 초과에 도달하는지 확인하십시오.
비 블로킹 모드를 사용하여 폴링으로 읽기 지속 시간을 제어 할 수도 있습니다.
시간 초과 매개 변수를 합리적으로 설정하는 것이 네트워크 프로그램의 안정적인 응답을 보장하는 핵심입니다.