효율적인 네트워크 서비스를 구축 할 때 대기 시간은 피할 수없는 중요한 지표입니다. 일반적인 스크립팅 언어로서, PHP는 또한 네트워크 프로그래밍에서 풍부한 API를 제공합니다. 여기서 Socket_accept () 함수는 종종 서버 측의 연결 수신을 처리하는 데 사용됩니다. 비교적 간단하게 사용되지만, 저도 및 대도시가 높은 서비스를 구축하려면 일련의 최적화 기술과 실제 응용 방법을 마스터해야합니다.
Socket_accept () 는 청취 소켓에서 연결 요청을 수락하기 위해 PHP 소켓 확장에서 제공하는 기능입니다. 서버가 socket_create () 및 socket_bind () 를 통해 소켓을 생성하고 바인딩하면 socket_listen ()이 청취를 시작한 다음 socket_accept () 를 통해 클라이언트의 연결을받을 수 있습니다.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
while (true) {
$client = socket_accept($socket);
if ($client) {
socket_write($client, "방문에 오신 것을 환영합니다 m66.net 네트워크 서비스\n");
socket_close($client);
}
}
위의 코드는 기본 TCP 서버를 구축하지만 성능은 "낮은 대기 시간"요구 사항을 충족하는 것과는 거리가 멀다.
I/O 차단으로 인한 지연 기본적으로 Socket_accept () 는 차단 호출입니다. 즉, 클라이언트 연결이 없으면 스크립트가 해당 라인에서 중지되고 CPU 시간을 낭비하고 후속 논리 처리를 차단합니다.
직렬 처리 연결 <br> 한 번에 하나의 클라이언트 요청 만 처리되므로 동시성 기능이 부족하여 대기열이 발생하여 대기 시간이 증가합니다.
부적절한 자원 관리 <br> 시간 초과를 설정하지 않고 시간에 연결을 해제하지 못하고 버퍼를 제대로 설정하지 않으면 모두 응답 속도에 영향을 줄 수 있습니다.
socket_set_nonblock () 을 통해 비 블로킹 모드를 설정하거나 socket_select ()를 사용하여 차단 및 대기를 피하기 위해 여러 소켓을 동시에들을 수 있습니다.
socket_set_nonblock($socket);
$clients = [$socket];
while (true) {
$read = $clients;
if (socket_select($read, $write = null, $except = null, 0, 200000)) {
foreach ($read as $sock) {
if ($sock === $socket) {
$client = socket_accept($socket);
if ($client !== false) {
socket_set_nonblock($client);
$clients[] = $client;
socket_write($client, "방문에 오신 것을 환영합니다 m66.net!\n");
}
} else {
$data = socket_read($sock, 1024, PHP_NORMAL_READ);
if ($data === false || $data === "") {
$index = array_search($sock, $clients);
socket_close($sock);
unset($clients[$index]);
} else {
socket_write($sock, "당신은 그것을 보냈습니다: $data");
}
}
}
}
}
수신 및 전송 시간은 Socket_set_option () 을 통해 제어 할 수 있도록 연결 문제로 인해 차단을 피할 수 있습니다.
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ["sec"=>1, "usec"=>0]);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ["sec"=>1, "usec"=>0]);
수천 개의 연결을 수행 해야하는 고전성 응용 프로그램의 경우 Libevent 또는 Swoole 과 같은 확장을 사용하는 것이 좋습니다. 그들은 바닥에보다 효율적인 Epoll/Kqueue 모델을 사용하여 I/O 대기 시간을 크게 줄입니다.
// 사용 Swoole 实现高性能네트워크 서비스
$server = new Swoole\Server("0.0.0.0", 9501);
$server->on("connect", function ($server, $fd) {
$server->send($fd, "방문에 오신 것을 환영합니다 m66.net 네트워크 서비스\n");
});
$server->on("receive", function ($server, $fd, $reactor_id, $data) {
$server->send($fd, "당신은 그것을 보냈습니다:$data");
});
$server->on("close", function ($server, $fd) {
echo "고객 {$fd} 닫은\n";
});
$server->start();
실시간 데이터 수집 서비스 : 비 차단 소켓을 통해 IoT 장치에서 실시간 데이터를 수신합니다.
온라인 채팅방 : Swoole을 사용하여 동시 채팅 서비스가 높고 모든 데이터 교환은 낮은 대기 시간을 유지합니다.
게임 서버 백엔드 : 소규모 전투 게임은 기본 소켓을 사용하여 저도의 플레이어 커뮤니케이션을 달성 할 수 있습니다.
API 게이트웨이 : 중간 계층 소켓 서비스를 구축하여 요청을 받고 캐시 데이터에 신속하게 응답합니다.
Socket_accept () 는 PHP의 기본 기능이지만 진정으로 낮은 긴장 서비스를 구축하기위한 기본 기능이지만, 비 블로킹 I/O, 합리적인 리소스 제어, 동시성 모델 등과 같은 여러 차원에서 최적화해야합니다. 다양한 비즈니스 시나리오에 따라 적절한 기술 솔루션 (기본 소켓, Select, Swoole, Libevent)을 선택하는 것이 높은 네트워크 서비스를 달성하기위한 핵심입니다. 위의 기술의 도움을 받아 PHP 환경에서도 반응적이고 안정적 인 서버 측 아키텍처를 만들 수 있으며 비즈니스에 대한 견고한 기술 지원을 제공 할 수 있습니다.