PHP에서 Socket_accept () 함수는 소켓 서버 기반을 구현하는 주요 기능 중 하나입니다. 클라이언트 연결 요청을 수락하는 데 사용되며 네트워크 서비스를 구축 할 때 클라이언트 연결을 처리 할 때 핵심 링크입니다. 이 기사는 Socket_accept ()를 사용하여 효율적이고 동시에 클라이언트 연결 처리를 달성하고 샘플 코드를 결합하여 실제 응용 프로그램을 보여주는 방법을 자세히 소개합니다.
Socket_accept ()는 청취 된 소켓에서 연결된 클라이언트 소켓을 꺼내고 클라이언트와의 커뮤니케이션을 위해 새로운 소켓 리소스를 반환합니다. 연결이 없으면 대기 대기를 블록하십시오. 간단히 말해서 서버가 클라이언트 연결을 수락하는 입구입니다.
$clientSocket = socket_accept($serverSocket);
if ($clientSocket === false) {
echo "클라이언트 연결을 수락하는 데 실패했습니다: " . socket_strerror(socket_last_error()) . "\n";
} else {
echo "클라이언트 연결을 성공적으로 수락하십시오\n";
}
PHP 자체는 단일 스레드입니다. 여러 연결을 처리하기 위해 Socket_Accept ()를 직접 사용하면 처리가 완료되지 않으면 서버가 특정 클라이언트에서 차단하여 동시에 다른 연결 요청에 응답 할 수 없습니다.
이 문제를 해결하기 위해 일반적으로 사용되는 솔루션에는 다음이 포함됩니다.
다중 프로세스/멀티 스레딩 : PCNTL_FORK () 를 통해 하위 프로세스를 작성하여 각 클라이언트를 처리합니다.
비 블로킹 모드 및 멀티플렉싱 : socket_set_nonblock () 및 socket_select () 와 함께 단일 스레드에서 다중 연결을 폴링합니다.
이벤트 중심 프레임 워크 : RearTPHP와 같은 타사 라이브러리를 사용하여 비동기 IO를 구현하십시오.
이 기사는 다중 프로세스 방법에 중점을두고 Socket_accept ()를 사용하여 동시 클라이언트를 효율적으로 처리하는 방법을 보여줍니다.
다음 예제는 기본 프로세스가 연결을 듣고 수신하는 데 도움이되는 간단한 다중 프로세스 서버를 보여줍니다. 아동 프로세스는 클라이언트 요청을 처리 할 책임이 있습니다.
<?php
// 만들다 TCP socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, '0.0.0.0', 8080);
socket_listen($server);
echo "서버 시작,포트를 들어보세요 8080...\n";
while (true) {
// 클라이언트 연결을 수락합니다(차단하다)
$client = socket_accept($server);
if ($client === false) {
echo "socket_accept 실수: " . socket_strerror(socket_last_error()) . "\n";
continue;
}
// 만들다하위 프로세스 처리 클라이언트
$pid = pcntl_fork();
if ($pid == -1) {
echo "无法만들다子进程\n";
socket_close($client);
continue;
} elseif ($pid > 0) {
// 상위 프로세스는 클라이언트 연결을 닫습니다,계속 모니터링하십시오
socket_close($client);
// 아동 프로세스를 기다리거나 신호 처리를 사용하여 복구 할 수 있습니다.
} else {
// 하위 프로세스 처리 클라이언트
socket_close($server); // 어린이 과정에서 청취 소켓을 닫습니다
$msg = "방문에 오신 것을 환영합니다 m66.net PHP 섬기는 사람!\n";
socket_write($client, $msg, strlen($msg));
// 클라이언트 메시지를 읽으십시오
$input = socket_read($client, 2048);
echo "클라이언트 메시지를 받았습니다: $input\n";
// 간단한 에코
socket_write($client, "섬기는 사람已收到: " . $input);
socket_close($client);
exit(0); // 하위 프로세스 종료
}
}
socket_create를 사용하여 TCP 소켓을 만들고 포트를 바인딩하고 듣습니다.
Socket_Accept ()를 사용하여 클라이언트 연결 대기를 차단하십시오.
PCNTL_FORK ()를 사용하여 자식 프로세스를 만듭니다. 부모 프로세스는 클라이언트 소켓을 닫고 계속 듣습니다. 아동 프로세스는 클라이언트 데이터를 읽고 쓰는 책임이 있습니다.
좀비 과정을 피하기 위해 아동 과정이 완료된 후 종료하십시오.
좀비 프로세스 방지 <br> 주요 프로세스는 좀비 프로세스가 축적되는 것을 방지하기 위해 신호 처리 또는 PCNTL_WAITPID () 의 정기적 인 호출을 통해 하위 프로세스를 재활용해야합니다.
비 블로킹 및 멀티플렉싱 <br> socket_select ()를 사용하여 멀티플렉싱을 구현하여 프로세스 오버 헤드를 피하기 위해 단일 프로세스에서 여러 클라이언트를 듣을 수 있습니다.
연결 수영장 관리 <br> 많은 수의 연결의 경우 연결 풀 및 작업 대기열을 서버 안정성을 향상 시키도록 설계 할 수 있습니다.
오류 처리 및 로깅 <br> 세부 오류 처리 및 생산 환경에 로깅을 통합하면 문제 문제 해결에 도움이 될 수 있습니다.
Socket_accept () 를 통해 다중 프로세스 방법과 결합하면 효율적인 동시 클라이언트 연결 처리를 달성 할 수 있습니다. PHP 자체는 동시 네트워크 프로그래밍에 능숙하지 않지만 합리적인 설계 및 시스템 호출을 통해 적시에 반응 형 네트워크 서비스를 만들 수 있습니다.
다중 프로세스 모드는 간단하고 직관적이지만 자원 소비가 높은 단점도 있습니다. 비 블로킹 IO와 이벤트 중심의 프레임 워크를 결합하는 것이보다 현대적인 접근법입니다. 어느 쪽이든, socket_accept ()는 연결 처리의 기초입니다.