웹 프로그래밍에서 PHP는 일반적으로 HTTP 요청을 처리하는 데 사용되지만 실제로 PHP는 Socket_* 시리즈 기능을 포함한 풍부한 기본 네트워크 작동 기능을 제공하며 TCP 통신 기능을 구현하는 데 사용할 수 있습니다. 이 기사에서는 PHP Socket_accept () 함수를 기반으로 간단한 대화방 응용 프로그램 프로토 타입을 구축하는 방법을 보여줍니다. PHP의 소켓 프로그래밍 메커니즘을 이해하는 데 도움이됩니다.
채팅방의 기본 메커니즘은 다음과 같습니다. 서버는 포트에 청취하고 여러 클라이언트가 소켓을 통해 서버에 연결하고 서버는 클라이언트의 연결을 수락하고 ( Socket_Accept () 를 통해)를 수신하고 수신 된 메시지를 다른 모든 클라이언트에게 브로드 캐스트합니다.
서버는 소켓을 만들고, 포트를 바인딩하고, 연결을 듣고, 루프에서 클라이언트 연결을 수락 한 다음 메시지를 처리하고 전달할 책임이 있습니다.
<?php
$host = '0.0.0.0';
$port = 12345;
$clients = [];
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($server, $host, $port);
socket_listen($server);
echo "Server started on $host:$port\n";
while (true) {
$read = $clients;
$read[] = $server;
$write = $except = null;
if (socket_select($read, $write, $except, null) < 1) {
continue;
}
if (in_array($server, $read)) {
$client = socket_accept($server);
if ($client) {
socket_getpeername($client, $addr, $port);
echo "Client connected: {$addr}:{$port}\n";
$clients[] = $client;
socket_write($client, "채팅방에 오신 것을 환영합니다!\n");
}
unset($read[array_search($server, $read)]);
}
foreach ($read as $sock) {
$data = @socket_read($sock, 2048, PHP_NORMAL_READ);
if ($data === false) {
$index = array_search($sock, $clients);
socket_getpeername($sock, $addr, $port);
echo "Client disconnected: {$addr}:{$port}\n";
unset($clients[$index]);
socket_close($sock);
continue;
}
$data = trim($data);
if (!empty($data)) {
socket_getpeername($sock, $addr, $port);
$message = "[{$addr}:{$port}] 설명하다: {$data}\n";
foreach ($clients as $client) {
if ($client !== $sock) {
socket_write($client, $message);
}
}
echo $message;
}
}
}
클라이언트는 Telnet을 사용하거나 브라우저를 사용하여 WebSocket 프록시와 연결할 수 있습니다. 그러나 PHP를 사용하여 클라이언트를 시뮬레이션하여 메시지를 보내려면 다음 코드를 사용할 수도 있습니다.
<?php
$host = '127.0.0.1';
$port = 12345;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $host, $port);
echo socket_read($socket, 2048);
while (true) {
echo "메시지를 입력하십시오: ";
$msg = trim(fgets(STDIN));
if ($msg === 'exit') {
break;
}
socket_write($socket, $msg . "\n");
$response = socket_read($socket, 2048);
echo "메시지를 받았습니다: " . $response;
}
socket_close($socket);
다중 프로세스 지원 : PCNTL_FORK ()를 사용하여 주요 프로세스의 차단을 피하기 위해 다중 프로세스 지원을 달성 할 수 있습니다.
로그 관리 : 각 메시지에 타임 스탬프를 추가하여 나중에 문제 해결을 용이하게합니다.
ID : 각 클라이언트에 대한 별명 또는 ID를 설정하면 사용자 경험이 향상 될 수 있습니다.
프론트 엔드 연결 : WebSocket 전달을 통해 웹 페이지 프론트 엔드와 PHP 대화방을 통합하고 Communication Bridge에 http://m66.net/socket-proxy 와 유사한 미들웨어를 사용할 수 있습니다.
socket_accept () 와 같은 PHP 소켓 함수를 통해 명령 줄 환경에서 기본 채팅 서비스를 구현할 수 있습니다. PHP는 실시간 커뮤니케이션의 주류 언어는 아니지만, 기본 기능은 여전히 TCP 통신 기능을 완료하는 데 사용될 수 있으며, 이는 학습 네트워크 프로그래밍 메커니즘을위한 소개 예로 적합합니다. 프로덕션 환경에 배치하려면보다 전문적인 메시지 대기열과 비동기 서버 프레임 워크를 결합하여 성능과 안정성을 향상시키는 것이 좋습니다.