Swoole 기반 PHP 와 websocket 채 팅 방 구현

websocket
웹 소켓 은 네트워크 통신 프로 토 콜 일 뿐 입 니 다.
http,ftp 등 이 모두 네트워크 통신 프로 토 콜 인 것 처럼;더 이상 생각 하지 마라.
HTTP 와 같은 비 영구적 인 프로 토 콜 에 비해 Websocket 은 네트워크 통신 을 지속 적 으로 하 는 프로 토 콜 입 니 다.
웹 소켓 과 HTTP 의 관계

교 집합 은 있 지만 전 부 는 아니다.
웹 소켓 은 HTTP 의 일부 프로 토 콜 을 빌려 악 수 를 한 번 했 을 뿐이다.(HTTP 의 세 번 의 악수,여기 서 한 번 만 완료)
http 와 websocket 요청 헤더 비교:


HTTP:
원래 클 라 이언 트 는 http(말 타기)를 통 해 편지 요청 서버,서버 처리 요청(답장 쓰기)을 가지 고 http(말 타기)을 통 해 다시 돌아 갑 니 다.연결 끊 기;
WebSocket:
클 라 이언 트 는 http(말 타기)를 통 해 편지 요청 서버 를 가지 고 있 으 나Upgrade:websocketConnection:Upgrade(두 개의 파이프)를 가지 고 있 습 니 다.서버 가 웹 소켓 프로 토 콜(두 개의 파이프 가 있 는 인터페이스)을 지원 하면 웹 소켓 프로 토 콜 을 사용 하여 사용 가능 한 정보(말 버 리 기)를 되 돌려 줍 니 다.그 후에 정 보 를 전달 할 때 모두 이 두 개의 파 이 프 를 사용 합 니 다.한 측 이 인위적으로 파 이 프 를 차단 하지 않 는 한.서버 가 지원 하지 않 으 면 클 라 이언 트 가 링크 를 요청 하 는 데 실패 하고 오류 정 보 를 되 돌려 줍 니 다.
http 와 websocket 응답 헤드 비교:


웹 소켓 과 ajax 폴 링,long poll 의 차이
우선 ajax 폴 링,ajax 폴 링 의 원 리 는 매우 간단 합 니 다.브 라 우 저 로 하여 금 몇 초 간격 으로 요청 을 보 내 서버 에 새로운 정보 가 있 는 지 물 어보 게 합 니 다.
장면 재현:
클 라 이언 트:라 라 라,새로운 정보 가 있 습 니까?(Request)
서버:없 음(Response)
클 라 이언 트:라 라 라,새로운 정보 가 있 습 니까?(Request)
서버:없습니다.Response)
클 라 이언 트:라 라 라,새로운 정보 가 있 습 니까?(Request)
서버:짜증 나,아니 야.Response)
클 라 이언 트:라 라 라,새로운 소식 없 나(Request)
서버:됐어,있어,줄 게.Response)
클 라 이언 트:라 라 라,새로운 소식 없 나(Request)
서버:...아니...아니요.없다
long poll 의 실제 원 리 는 ajax 폴 링 과 차이 가 많 지 않 고 모두 폴 링 방식 을 사용 하여 논술 하지 않 습 니 다.
위 에서 알 수 있 듯 이 폴 링 은 HTTP 연결 을 계속 구축 한 다음 에 서버 처 리 를 기다 리 는 것 으로 HTTP 프로 토 콜 의 또 다른 특징,수 동적 인 특징 을 나 타 낼 수 있다.또한 http 의 모든 요청 과 응답 이 끝 난 후에 서버 는 클 라 이언 트 정 보 를 모두 버 리 고 다음 요청 은 신분 정보(쿠키)를 휴대 해 야 하 며 상태 성 이 없습니다.
웹 소켓 의 등장 으로 이 문제 들 을 깔끔하게 해결 하 였 습 니 다.
그래서 위의 상황 은 다음 과 같이 수정 할 수 있다.
클 라 이언 트:라 라 라,웹 소켓 프로 토 콜 을 만 들 려 고 합 니 다.필요 한 서비스:chat,웹 소켓 프로 토 콜 버 전:17(HTTP Request)
서버:ok,확인,웹 소켓 프로 토 콜 로 업그레이드(HTTP Protocols Switched)
클 라 이언 트:메시지 가 있 을 때 밀어 주세요.
서버:ok,가끔 알려 줄 게.
클 라 이언 트:balab 시작 투 투 alabala
서버:창 정 공 ala
클 라 이언 트:코피 나 요.닦 을 게 요.
서버:하하 불 교육
서버:웃 겨 죽 겠 네 하하
Swoole
그러나 PHP 로 HTML 5 에 맞 춰 웹 소켓 요청 과 응답 을 한 번 완성 하기 위해 형 은 수많은 산 과 물 을 건 너 밀림 깊 은 곳 에서 Swole 을 발견 했다.
PHP 언어의 비동기,병렬,고성능 네트워크 통신 프레임 워 크 는 순수 C 언어 로 작 성 됩 니 다.PHP 언어의 비동기 다 중 스 레 드 서버,비동기 TCP/UDP 네트워크 클 라 이언 트,비동기 MySQL,데이터베이스 연결 풀,AsyncTask,메시지 큐,밀리초 타이머,비동기 문서 읽 기,비동기 DNS 조 회 를 제공 합 니 다.
지원 하 는 서비스:
HttpServer
WebSocket Server
TCP Server
TCP Client
Async-IO(비동기)
작업(정시 퀘 스 트)
환경 의존:
Linux,FreeBSD,MacOS,3 가지 운영 체제 만 지원 합 니 다.
Linux 커 널 버 전 2.3.2 이상
PHP 5.3.10 이상 버 전
gcc 4.4 이상 버 전 또는 clang
cmake 2.4+,libswoole.so 를 C/C++라 이브 러 리 로 컴 파일 할 때 cmake 를 사용 해 야 합 니 다.
설치:
시스템 에 다음 과 같은 소프트웨어 가 있 음 을 보증 해 야 합 니 다.
pp-5.3.10 또는 더 높 은 버 전
gcc-4.4 또는 더 높 은 버 전
make
autoconf
Swoole 은 PHP 확장 으로 실 행 됩 니 다.
설치(루트 권한):
cd swoole
phpize
./configure
make
sudo make install
php.ini 설정
extension=swoole.so
스 울 학생 을 연구 하고 싶 어서 수첩 을 직접 보 러 갑 니 다.(잘 쓰 지 는 못 했 지만 알 아 볼 수 있 습 니 다.)
채 팅 방 을 만들어 보도 록 하 겠 습 니 다.
서버 쪽:socket.php

//  websocket     ,  0.0.0.0:9502  
$ws = new swoole_websocket_server("0.0.0.0", 9502);

//  WebSocket      
$ws->on('open', function ($ws, $request) {
  $fd[] = $request->fd;
  $GLOBALS['fd'][] = $fd;
  //$ws->push($request->fd, "hello, welcome
"); }); // WebSocket $ws->on('message', function ($ws, $frame) { $msg = 'from'.$frame->fd.":{$frame->data}
"; //var_dump($GLOBALS['fd']); //exit; foreach($GLOBALS['fd'] as $aa){ foreach($aa as $i){ $ws->push($i,$msg); } } // $ws->push($frame->fd, "server: {$frame->data}"); // $ws->push($frame->fd, "server: {$frame->data}"); }); // WebSocket $ws->on('close', function ($ws, $fd) { echo "client-{$fd} is closed
"; }); $ws->start();
클 라 이언 트:Socket.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<div id="msg"></div>
<input type="text" id="text">
<input type="submit" value="    " onclick="song()">
</body>
<script>
  var msg = document.getElementById("msg");
  var wsServer = 'ws://192.168.1.253:9502';
  //  websocket      :
  //  :ws/wss(  )://ip:port (   )
  var websocket = new WebSocket(wsServer);
  //onopen      
  websocket.onopen = function (evt) {
    //websocket.readyState   :
    /*
    CONNECTING  0  The connection is not yet open.
    OPEN  1  The connection is open and ready to communicate.
    CLOSING  2  The connection is in the process of closing.
    CLOSED  3  The connection is closed or couldn't be opened.
    */
    msg.innerHTML = websocket.readyState;
  };

  function song(){
    var text = document.getElementById('text').value;
    document.getElementById('text').value = '';
    //        
    websocket.send(text);
  }
   //      
//  websocket.onclose = function (evt) {
//    console.log("Disconnected");
//  };

  //onmessage          
  websocket.onmessage = function (evt) {
    msg.innerHTML += evt.data +'<br>';
//    console.log('Retrieved data from server: ' + evt.data);
  };
//        
//  websocket.onerror = function (evt, e) {
//    console.log('Error occured: ' + evt.data);
//  };

</script>
</html>
이상 은 Swoole 을 바탕 으로 PHP 와 websocket 채 팅 방 을 실현 하 는 모든 내용 입 니 다.본 고 는 PHP 와 websocket 을 배우 고 채 팅 방 을 개발 하 는 데 도움 이 될 것 이 라 고 믿 습 니 다.

좋은 웹페이지 즐겨찾기