찾다
백엔드 개발PHP 튜토리얼PHP에서 웹소켓을 사용하는 예제에 대한 자세한 설명

WebSocket이란 무엇인가요?

WebSocket은 http에 비해 비영속적인 영구 프로토콜입니다. 간단한 예를 들자면, http1.0의 라이프사이클은 요청, 즉 요청과 응답으로 정의됩니다. http의 경우 http1에서는 클라이언트와 서버 간의 세션이 종료됩니다. 약간의 개선이 있습니다. 즉, 연결 유지가 추가되었습니다. 즉, 하나의 http 연결에서 여러 요청 요청과 여러 응답 수락 작업을 수행할 수 있습니다. 그러나 실시간 통신에서는 큰 역할을 하지 않습니다. HTTP 요청은 클라이언트에 의해서만 시작될 수 있으며 서버는 정보를 반환할 수 있습니다. 즉, 서버는 클라이언트에 정보를 적극적으로 푸시할 수 없으며 요구 사항을 충족할 수 없습니다. 실시간 커뮤니케이션의 시작입니다. WebSocket은 지속적인 연결을 수행할 수 있습니다. 즉, 클라이언트는 핸드셰이크만 수행하면 되며, 성공 후에도 데이터 통신이 계속될 수 있습니다. WebSocket이 클라이언트와 서버 간의 전이중 통신을 구현한다는 점은 주목할 가치가 있습니다. 데이터가 클라이언트에 푸시되면 사전에 통신합니다.

다음 그림은 클라이언트와 서버 사이에 웹소켓 연결을 설정할 때 핸드셰이크 부분을 보여줍니다. 노드에서 제공하는 net 모듈이 이미 소켓 소켓에 대해 이 작업을 수행했기 때문에 이 부분은 노드에서 매우 쉽게 완료할 수 있습니다. 캡슐화 처리가 없으면 개발자는 연결 설정을 처리할 필요 없이 데이터를 사용할 때 데이터의 상호 작용만 고려하면 됩니다.

PHP에서 웹소켓을 사용하는 예제에 대한 자세한 설명

소켓 구축 시 클라이언트와 서버 간의 핸드셰이크 대화 내용, 즉 요청과 응답

a. WebSocket 구축 시 클라이언트가 서버에서 요청한 정보

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket //告诉服务器现在发送的是WebSocket协议
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== //是一个Base64 encode的值,这个是浏览器随机生成的,用于验证服务器端返回数据是否是WebSocket助理
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: php.cn

b. 클라이언트에서는 WebSocket 프로토콜에 따라 데이터를 처리하고 Sec-WebSocket-Key

HTTP/1.1 101 Switching Protocols
Upgrade: websocket //依然是固定的,告诉客户端即将升级的是Websocket协议,而不是mozillasocket,lurnarsocket或者shitsocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= //这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key,也就是client要求建立WebSocket验证的凭证
Sec-WebSocket-Protocol: chat

에 대한 암호화 및 기타 작업을 포함하여 반환합니다. PHP

1. PHP에서는 클라이언트와 서버 간에 소켓 통신이 이루어집니다. 먼저 PHP에서 소켓을 생성하고 포트를 수신합니다. 코드는 다음과 같습니다.

<?php
//传相应的IP与端口进行创建socket操作
function WebSocket($address,$port){
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);//1表示接受所有的数据包
socket_bind($server, $address, $port);
socket_listen($server);return $server;
}
?>

2. 데이터를 수신, 처리 및 전송하기 위해 WebSocket 채널을 끊는 루프를 설계합니다.

<?php
//对创建的socket循环进行监听,处理数据    
function run(){
  //死循环,直到socket断开
  while(true){
    $changes=$this->sockets;
    $write=NULL;
    $except=NULL;
    /*
    //这个函数是同时接受多个连接的关键,我的理解它是为了阻塞程序继续往下执行。
    socket_select ($sockets, $write = NULL, $except = NULL, NULL);
    $sockets可以理解为一个数组,这个数组中存放的是文件描述符。当它有变化(就是有新消息到或者有客户端连接/断开)时,socket_select函数才会返回,继续往下执行。 
    $write是监听是否有客户端写数据,传入NULL是不关心是否有写变化。 
    $except是$sockets里面要被排除的元素,传入NULL是”监听”全部。 
    最后一个参数是超时时间 
    如果为0:则立即结束 
    如果为n>1: 则最多在n秒后结束,如遇某一个连接有新动态,则提前返回 
    如果为null:如遇某一个连接有新动态,则返回
    */
    socket_select($changes,$write,$except,NULL);
    foreach($changes as $sock){
      //如果有新的client连接进来,则
      if($sock==$this->master){
        //接受一个socket连接
        $client=socket_accept($this->master);
        //给新连接进来的socket一个唯一的ID
        $key=uniqid();
        $this->sockets[]=$client;  //将新连接进来的socket存进连接池
        $this->users[$key]=array(
          &#39;socket&#39;=>$client,  //记录新连接进来client的socket信息
          &#39;shou&#39;=>false       //标志该socket资源没有完成握手
        );
        //否则1.为client断开socket连接,2.client发送信息
      }else{
        $len=0;
        $buffer=&#39;&#39;;
        //读取该socket的信息,注意:第二个参数是引用传参即接收数据,第三个参数是接收数据的长度
        do{
          $l=socket_recv($sock,$buf,1000,0);
          $len+=$l;
          $buffer.=$buf;
        }while($l==1000);
        //根据socket在user池里面查找相应的$k,即健ID
        $k=$this->search($sock);
        //如果接收的信息长度小于7,则该client的socket为断开连接
        if($len<7){
          //给该client的socket进行断开操作,并在$this->sockets和$this->users里面进行删除
          $this->send2($k);
          continue;
        }
        //判断该socket是否已经握手
        if(!$this->users[$k][&#39;shou&#39;]){
          //如果没有握手,则进行握手处理
          $this->woshou($k,$buffer);
        }else{
          //走到这里就是该client发送信息了,对接受到的信息进行uncode处理
          $buffer = $this->uncode($buffer,$k);
          if($buffer==false){
            continue;
          }
          //如果不为空,则进行消息推送操作
          $this->send($k,$buffer);
        }
      }
    }
  }
}
?>

3. WebSocket의 예비 작업을 완료한 후 클라이언트가 WebSocket을 생성하는 것은 매우 간단합니다. 코드는 다음과 같습니다.

var ws = new WebSocket("ws://IP:端口");
//握手监听函数
ws.onopen=function(){
  //状态为1证明握手成功,然后把client自定义的名字发送过去
  if(so.readyState==1){
    //握手成功后对服务器发送信息
    so.send(&#39;type=add&ming=&#39;+n);
  }
}
//错误返回信息函数
ws.onerror = function(){
  console.log("error");
};
//监听服务器端推送的消息
ws.onmessage = function (msg){
  console.log(msg);
}
//断开WebSocket连接
ws.onclose = function(){
  ws = false;
}

【관련 튜토리얼 추천】

1. 🎜>php.cn Dugu Jiujian (4) - PHP 비디오 튜토리얼 "

2 .

초보부터 마스터까지 PHP 프로그래밍에 대한 전체 튜토리얼 세트

위 내용은 PHP에서 웹소켓을 사용하는 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
세션을 저장하기 위해 데이터베이스를 사용하면 어떤 장점이 있습니까?세션을 저장하기 위해 데이터베이스를 사용하면 어떤 장점이 있습니까?Apr 24, 2025 am 12:16 AM

데이터베이스 스토리지 세션 사용의 주요 장점에는 지속성, 확장 성 및 보안이 포함됩니다. 1. 지속성 : 서버가 다시 시작 되더라도 세션 데이터는 변경되지 않아도됩니다. 2. 확장 성 : 분산 시스템에 적용하여 세션 데이터가 여러 서버간에 동기화되도록합니다. 3. 보안 : 데이터베이스는 민감한 정보를 보호하기 위해 암호화 된 스토리지를 제공합니다.

PHP에서 사용자 정의 세션 처리를 어떻게 구현합니까?PHP에서 사용자 정의 세션 처리를 어떻게 구현합니까?Apr 24, 2025 am 12:16 AM

SessionHandlerInterface 인터페이스를 구현하여 PHP에서 사용자 정의 세션 처리 구현을 수행 할 수 있습니다. 특정 단계에는 다음이 포함됩니다. 1) CustomsessionHandler와 같은 SessionHandlerInterface를 구현하는 클래스 만들기; 2) 인터페이스의 방법 (예 : Open, Close, Read, Write, Despare, GC)의 수명주기 및 세션 데이터의 저장 방법을 정의하기 위해 방법을 다시 작성합니다. 3) PHP 스크립트에 사용자 정의 세션 프로세서를 등록하고 세션을 시작하십시오. 이를 통해 MySQL 및 Redis와 같은 미디어에 데이터를 저장하여 성능, 보안 및 확장 성을 향상시킬 수 있습니다.

세션 ID 란 무엇입니까?세션 ID 란 무엇입니까?Apr 24, 2025 am 12:13 AM

SessionId는 웹 애플리케이션에 사용되는 메커니즘으로 사용자 세션 상태를 추적합니다. 1. 사용자와 서버 간의 여러 상호 작용 중에 사용자의 신원 정보를 유지하는 데 사용되는 무작위로 생성 된 문자열입니다. 2. 서버는 쿠키 또는 URL 매개 변수를 통해 클라이언트로 생성하여 보낸다. 3. 생성은 일반적으로 임의의 알고리즘을 사용하여 독창성과 예측 불가능 성을 보장합니다. 4. 실제 개발에서 Redis와 같은 메모리 내 데이터베이스를 사용하여 세션 데이터를 저장하여 성능 및 보안을 향상시킬 수 있습니다.

무국적 환경 (예 : API)에서 세션을 어떻게 처리합니까?무국적 환경 (예 : API)에서 세션을 어떻게 처리합니까?Apr 24, 2025 am 12:12 AM

JWT 또는 쿠키를 사용하여 API와 같은 무국적 환경에서 세션을 관리 할 수 ​​있습니다. 1. JWT는 무국적자 및 확장 성에 적합하지만 빅 데이터와 관련하여 크기가 크다. 2. 쿠키는보다 전통적이고 구현하기 쉽지만 보안을 보장하기 위해주의해서 구성해야합니다.

세션과 관련된 크로스 사이트 스크립팅 (XSS) 공격으로부터 어떻게 보호 할 수 있습니까?세션과 관련된 크로스 사이트 스크립팅 (XSS) 공격으로부터 어떻게 보호 할 수 있습니까?Apr 23, 2025 am 12:16 AM

세션 관련 XSS 공격으로부터 응용 프로그램을 보호하려면 다음 조치가 필요합니다. 1. 세션 쿠키를 보호하기 위해 Httponly 및 Secure 플래그를 설정하십시오. 2. 모든 사용자 입력에 대한 내보내기 코드. 3. 스크립트 소스를 제한하기 위해 컨텐츠 보안 정책 (CSP)을 구현하십시오. 이러한 정책을 통해 세션 관련 XSS 공격을 효과적으로 보호 할 수 있으며 사용자 데이터가 보장 될 수 있습니다.

PHP 세션 성능을 어떻게 최적화 할 수 있습니까?PHP 세션 성능을 어떻게 최적화 할 수 있습니까?Apr 23, 2025 am 12:13 AM

PHP 세션 성능을 최적화하는 방법 : 1. 지연 세션 시작, 2. 데이터베이스를 사용하여 세션을 저장, 3. 세션 데이터 압축, 4. 세션 수명주기 관리 및 5. 세션 공유 구현. 이러한 전략은 높은 동시성 환경에서 응용의 효율성을 크게 향상시킬 수 있습니다.

SESSION.GC_MAXLIFETIME 구성 설정은 무엇입니까?SESSION.GC_MAXLIFETIME 구성 설정은 무엇입니까?Apr 23, 2025 am 12:10 AM

THESESSION.GC_MAXLIFETIMESETTINGINSTTINGTINGSTINGTERMINESTERMINESTERSTINGSESSIONDATA, SETINSECONDS.1) IT'SCONFIGUDEDINPHP.INIORVIAINI_SET ()

PHP에서 세션 이름을 어떻게 구성합니까?PHP에서 세션 이름을 어떻게 구성합니까?Apr 23, 2025 am 12:08 AM

PHP에서는 Session_Name () 함수를 사용하여 세션 이름을 구성 할 수 있습니다. 특정 단계는 다음과 같습니다. 1. Session_Name () 함수를 사용하여 Session_Name ( "my_session")과 같은 세션 이름을 설정하십시오. 2. 세션 이름을 설정 한 후 세션을 시작하여 세션을 시작하십시오. 세션 이름을 구성하면 여러 응용 프로그램 간의 세션 데이터 충돌을 피하고 보안을 향상시킬 수 있지만 세션 이름의 독창성, 보안, 길이 및 설정 타이밍에주의를 기울일 수 있습니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.