인터넷과 모바일 장치의 대중화로 인해 업무 효율성을 높이기 위해 실시간 공동 작업 도구가 점점 더 필요해지고 있습니다. 이러한 배경에서 실시간 공동 작업 도구의 인스턴트 메시징 및 공동 편집과 같은 기능이 점점 더 대중화되고 있습니다. 이 기사에서는 PHP와 WebSocket의 도움으로 실시간 웹 기반 협업 도구를 구현하는 방법을 소개합니다. 관련 코드 예제도 제공됩니다.
WebSocket은 새로운 유형의 웹 통신 프로토콜로, HTTP 프로토콜이 아닌 TCP 프로토콜을 기반으로 하며 양방향 통신 기능을 제공할 수 있습니다. Ajax 폴링 기술과 비교하여 WebSocket은 강력한 실시간 성능과 높은 통신 효율성이라는 장점을 가지고 있습니다.
이전에는 실시간으로 브라우저에 데이터를 푸시하려는 경우 일반적으로 긴 폴링 기술이 사용되었습니다. 즉, 클라이언트가 서버에 요청을 보내고 새 데이터를 사용할 수 있을 때까지 응답을 기다렸다가 반환했습니다. 응답. 이 접근 방식의 문제점은 요청과 응답이 쌍으로 이루어지면 요청이 빈번할 경우 서버에 많은 부담을 준다는 것입니다. WebSocket은 통신이 설정된 후에도 장기간 연결을 유지할 수 있으며 서버가 클라이언트에 메시지를 적극적으로 푸시하는 기능을 실현할 수 있습니다.
WebSocket의 통신 프로토콜은 HTTP와 같은 핸드셰이크를 사용하여 새 세션을 시작한 다음 양쪽 끝에서 양방향 데이터 전송을 수행합니다. WebSocket 통신 프로토콜은 일반 HTTP 프로토콜을 통해 연결을 설정한 후 WebSocket 연결로 변환할 수 있으므로 특별한 방법이나 포트를 통해 연결할 필요가 없습니다.
먼저 서버측 PHP 코드에서 WebSocketServer 클래스를 생성하고 관련 메서드를 구현해야 합니다.
class WebSocketServer { public function __construct($host, $port){ $this->host = $host; $this->port = $port; $this->sockets = array(); $this->users = array(); } public function run(){ $server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_bind($server, $this->host, $this->port); socket_listen($server); $this->sockets[] = $server; echo "WebSocket服务器运行在 $this->host:$this->port "; while(true){ $new_sockets = $this->sockets; $write = NULL; $except = NULL; socket_select($new_sockets, $write, $except, NULL); foreach($new_sockets as $socket){ if ($socket == $server){ $client = socket_accept($server); $this->sockets[] = $client; $this->users[] = array('socket'=>$client); } else { $bytes = @socket_recv($socket, $buffer, 1024, MSG_DONTWAIT); if ($bytes == 0) { $index = $this->find_user_by_socket($socket); if ($index >= 0) { array_splice($this->users, $index, 1); } socket_close($socket); $key = array_search($socket, $this->sockets); array_splice($this->sockets, $key, 1); } else { $index = $this->find_user_by_socket($socket); if($index >= 0) { $msg = $buffer; $this->handle_message($msg, $this->users[$index]); } } } } } } private function find_user_by_socket($socket){ $found = -1; foreach($this->users as $index => $user){ if ($user['socket'] == $socket){ $found = $index; break; } } return $found; } private function handle_message($msg, $user) { // 处理新消息 } }
WebSocket 프로토콜에서 메시지는 4~10바이트의 길이 헤더로 시작합니다. , 실제 데이터가 이어집니다. 위 코드에서는 길이 헤더를 구문 분석한 다음 해당 길이의 데이터 부분을 읽어야 합니다.
private function handle_message($msg, $user) { if(strlen($msg) === 0) { return; } $code = ord(substr($msg, 0, 1)) & 0x0F; switch ($code){ case 0x01: // 文本数据 $msg = substr($msg, 1); break; case 0x02: // 二进制数据 $msg = substr($msg, 1); break; case 0x08: // 连接关闭 $index = $this->find_user_by_socket($user['socket']); if ($index >= 0) { array_splice($this->users, $index, 1); } socket_close($user['socket']); $key = array_search($user['socket'], $this->sockets); array_splice($this->sockets, $key, 1); return; case 0x09: // ping case 0x0A: // pong return; default: return; } // 处理新消息 }
handle_message 메소드에서는 덤프 및 다른 클라이언트로 전송과 같이 클라이언트로부터 받은 새 메시지를 처리할 수 있습니다.
클라이언트 측에서는 JavaScript를 사용하여 WebSocket 연결을 생성하고 메시지를 보내고 받아야 합니다. 다음은 WebSocket 서버에 연결하기 위한 JavaScript 코드입니다.
var ws = new WebSocket("ws://localhost:8080/"); ws.onopen = function() { console.log("Connected to WebSocket server"); }; ws.onmessage = function(evt) { console.log("Received message: " + evt.data); }; ws.onclose = function(evt) { console.log("Disconnected from WebSocket server"); };
위 코드에서는 WebSocket 생성자를 사용하여 WebSocket 개체를 생성하고 이를 WebSocket 서버에 연결합니다. 또한 WebSocket 연결 상태와 수신된 메시지를 모니터링하기 위해 여러 이벤트 리스너(onopen, onmessage 및 onclose)를 설정했습니다.
WebSocket 서버에 데이터를 보내려면 WebSocket 개체의 send 메서드를 사용할 수 있습니다.
ws.send("Hello, WebSocket server!");
WebSocket 서버에서 새 메시지가 수신되면 onmessage 이벤트가 트리거되고 수신된 메시지를 얻을 수 있습니다. 이벤트 객체에서 데이터로 메시지를 보냅니다.
WebSocket 통신 지원으로 실제 협업 도구 애플리케이션을 개발할 수 있습니다. 공동 작업 도구에서는 다음 기능을 구현해야 합니다.
이를 분리할 수 있습니다. 함수는 다양한 PHP 클래스로 구현되고 실제 비즈니스 요구에 따라 개선됩니다. 다음은 예시입니다.
class WebSocketChat { private $users = array(); public function onOpen($user){ $this->users[$user['id']] = $user; $this->sendToAll(array('type'=>'notice','from'=>'System','msg'=>"{$user['name']}进入聊天室")); } public function onMessage($user, $msg){ $this->sendToAll(array('type'=>'msg','from'=>$user['name'],'msg'=>$msg)); } public function onClose($user){ unset($this->users[$user['id']]); $this->sendToAll(array('type'=>'notice','from'=>'System','msg'=>"{$user['name']}离开聊天室")); } private function sendToAll($msg){ foreach($this->users as $user){ $this->send($user, $msg); } } private function send($user, $msg){ socket_write($user['socket'], $this->encode(json_encode($msg))); } private function encode($msg){ $len = strlen($msg); if($len <= 125){ } if($len <= 65535){ } } }
위 예시에서는 로그인, 로그아웃, 메시지 보내기 및 기타 기능을 포함한 간단한 채팅방을 구현했습니다. WebSocketChat 클래스에서는 사용자 목록을 유지하고 사용자가 연결할 때 onOpen 메서드를 통해 새 사용자를 추가합니다. 사용자로부터 메시지를 받으면 sendToAll 메서드를 호출하여 연결된 모든 사용자에게 메시지를 보냅니다. 사용자의 연결이 끊어지면 사용자 목록에서 해당 사용자를 제거하고 해당 사용자가 떠났다는 사실을 다른 사용자에게 알립니다.
이 글에서는 PHP와 WebSocket의 도움으로 실시간 웹 기반 협업 도구를 구현하는 방법을 소개하고 관련 코드 예제를 제공했습니다. 인터넷과 모바일 장치의 대중화로 인해 실시간 협업 도구에 대한 수요가 점점 더 많아질 것입니다. 개발자는 사용자 요구를 더 잘 충족하기 위해 실제 요구 사항을 기반으로 2차 개발을 수행할 수 있습니다.
위 내용은 PHP와 WebSocket을 사용하여 실시간 협업 도구를 개발하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!