PHP 개발에서 성능 및 응답 속도는 긴 연결을 처리 할 때 중요한 고려 사항입니다. PHP 기본 소켓 작동이 차단되고 있습니다. 즉, 프로그램이 읽기 또는 쓰기 작업을 호출 할 때 작업이 완료 될 때까지 대기하므로 긴 연결을 처리 할 때 성능 병목 현상이 쉽게 발생할 수 있습니다. 이를 위해 Socket_set_Block 함수는 소켓의 차단 모드를 조정하는 데 합리적으로 사용되며, 이는 PHP 긴 연결의 성능을 효과적으로 최적화 할 수 있습니다.
socket_set_block은 소켓 차단 모드를 설정하는 PHP의 함수입니다. 그 목적은 소켓 차단을 유지하는 것입니다. 차단 모드에서 읽기 또는 쓰기 작업은 데이터가 준비되거나 반환하기 전에 작업이 완료 될 때까지 대기합니다.
bool socket_set_block ( resource $socket )
매개 변수 $ 소켓 : 차단 모드를 설정할 소켓 리소스.
반환 값 : 성공하면 true를 반환하고 실패한 경우 거짓 .
이에 해당하는 것은 소시 _set_nonblock 이며, 비 블로킹 모드를 설정하는 데 사용됩니다.
차단 모드 : 읽기 및 쓰기 작업을 수행 할 때는 운영이 완료되거나 시간이 초과 될 때까지 프로그램이 기다립니다.
비 블로킹 모드 : 읽기 및 쓰기 작업을 수행 할 때 프로그램은 즉시 반환되며 데이터가 없을 수 있습니다.
긴 연결에서 차단 모드를 사용하는 경우 데이터를 기다리는 동안 프로그램이 중단되어 다른 요청을 제 시간에 처리 할 수 없습니다. 비 블로킹 모드는 동시성을 향상시킬 수 있지만 코드 복잡성을 높이려면 추가 폴링 및 상태 판단이 필요합니다.
차단 모드와 비 블로킹 모드를 합리적으로 전환하면 PHP가 긴 연결에서 성능과 응답 성을 모두 고려할 수 있습니다. 특정 전략에는 다음이 포함됩니다.
연결이 방금 설정되면 데이터 대기로 인해 프로그램이 매달리지 않도록 비 블로킹 모드로 설정됩니다.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, "gitbox.net", 80);
socket_set_nonblock($socket);
예를 들어, 고정 길이 데이터를 읽을 준비를 할 때는 차단 모드를 사용하여 데이터가 그대로 읽히고 반 포켓 문제를 피하십시오.
socket_set_block($socket);
$data = socket_read($socket, 1024);
Socket_select를 사용하여 소켓에 무효 대기를 읽고 줄이는 데이터가 있는지 여부를 감지하십시오.
$read = [$socket];
$write = $except = null;
if (socket_select($read, $write, $except, 5) > 0) {
socket_set_block($socket);
$data = socket_read($socket, 1024);
// 처리 데이터
} else {
// 시간 초과 처리 또는 기타 논리
}
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create failed: " . socket_strerror(socket_last_error()));
}
$result = socket_connect($socket, "gitbox.net", 80);
if ($result === false) {
die("socket_connect failed: " . socket_strerror(socket_last_error($socket)));
}
// 먼저 비 블로킹을 설정하십시오,프로그램이 고착되지 않도록하십시오
socket_set_nonblock($socket);
// 요청을 보내십시오
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: keep-alive\r\n\r\n";
socket_write($socket, $request, strlen($request));
// 사용 socket_select 데이터를 읽을 때까지 기다리십시오
$read = [$socket];
$write = $except = null;
$timeout_sec = 5;
if (socket_select($read, $write, $except, $timeout_sec) > 0) {
// 데이터가 준비되면 차단 모드로 전환하십시오,완전한 데이터를 읽으십시오
socket_set_block($socket);
$response = '';
while ($out = socket_read($socket, 2048)) {
$response .= $out;
if (strlen($out) < 2048) {
break;
}
}
echo $response;
} else {
echo "데이터 시간 초과를 기다리거나 데이터가 없습니다";
}
socket_close($socket);
?>
Socket_set_Block을 사용하면 소켓 작업이 차단 모드로 들어가서 결정된 길이의 데이터를 읽고 무결성을 보장하는 데 적합합니다.
비 블로킹 모드 및 Socket_Select 와 합리적으로 일치하여 긴 연결로 프로그램의 불필요한 대기를 피하고 성능을 향상시킵니다.
긴 연결 성능을 최적화하는 핵심은 차단 및 비 블로킹을 유연하게 제어하고 이벤트 감지 메커니즘과 결합하여 자원 폐기물을 줄이는 것입니다.
위의 방법을 통해 PHP 긴 연결 처리는보다 효율적이고 안정적이며 고성능 및 응답 시간 요구 사항이있는 네트워크 응용 프로그램 시나리오에 적합합니다.