PHP에서 소켓 기반 차단 서버를 구현하면 기본 네트워크 통신 원칙을 이해하는 데 도움이 될 수 있습니다. 차단 모드는 데이터가 처리되거나 연결이 준비 될 때까지 서버가 데이터를 읽거나 작성할 때까지 대기한다는 것을 의미합니다. 이 기사는 단계별로 PHP의 소켓 확장을 사용하는 방법, 소켓 생성, 차단 모드 설정에 이르기까지 간단한 차단 서버를 구축하는 방법을 분석합니다.
먼저 PHP 환경에서 소켓 확장이 활성화되어 있는지 확인하십시오. php.ini 에서 다음 줄을 찾아서 타협하십시오 (있는 경우) :
extension=sockets
PHP -M 명령을 사용하여 확장자가 활성화되어 있는지 확인하십시오.
php -m | grep sockets
소켓을 볼 수 있으면 확장자가 활성화됩니다.
다음은 소켓을 생성하는 기본 단계이며 단계별로 각 기능의 역할을 소개합니다.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create() failed: " . socket_strerror(socket_last_error()) . "\n");
}
여기서 우리는 IPv4 ( AF_INET )를 기반으로 TCP 소켓 ( SOCK_STREAM )을 생성하고 있습니다.
포트 재사용과 같은 일부 소켓 옵션을 설정할 수 있습니다.
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
$host = '0.0.0.0';
$port = 9000;
if (!socket_bind($socket, $host, $port)) {
die("socket_bind() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}
if (!socket_listen($socket, 5)) {
die("socket_listen() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}
5는 최대 보류중인 연결 요청 수를 나타냅니다.
socket_set_block을 사용하여 소켓을 차단 모드로 설정하십시오.
if (!socket_set_block($socket)) {
die("socket_set_block() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}
차단 모드로 설정되면 후속 Socket_Accept , Socket_read 및 기타 기능이 작업이 완료 될 때까지 차단됩니다.
echo "서버가 시작되었습니다,포트를 들어보세요 $port...\n";
while (true) {
$clientSocket = socket_accept($socket);
if ($clientSocket === false) {
echo "socket_accept() failed: " . socket_strerror(socket_last_error($socket)) . "\n";
continue;
}
$input = socket_read($clientSocket, 1024);
if ($input === false) {
echo "socket_read() failed: " . socket_strerror(socket_last_error($clientSocket)) . "\n";
} else {
$input = trim($input);
echo "메시지를 받았습니다: $input\n";
$response = "당신은 그것을 보냈습니다:$input\n";
socket_write($clientSocket, $response, strlen($response));
}
socket_close($clientSocket);
}
종료해야 할 때 메인 소켓을 닫는 것을 잊지 마십시오.
socket_close($socket);
Telnet Connection 테스트와 같은 명령 줄 클라이언트를 사용할 수 있습니다.
telnet gitbox.net 9000
또는 연결 테스트를 위해 간단한 PHP 클라이언트를 작성하십시오.
socket_create to socket_set_block 에 의해 완전한 차단 서버를 빌드합니다. 이 모드는 교육, 디버깅 또는 대결 시나리오와 같은 간단한 네트워크 통신 응용 프로그램에 적합합니다. 동시 동시 시나리오의 경우 비 차단 모드를 사용하거나 선택 / 폴링을 사용하여보다 효율적인 이벤트 루프를 달성하는 것이 좋습니다.
이 기사의 실제 단계를 통해 PHP에 서버를 빌드하는 전체 프로세스를 마스터하고 추가 심층 네트워크 프로그래밍을위한 견고한 기반을 마련 할 수 있습니다.