ホームページ バックエンド開発 PHPチュートリアル PHPでのWebSocketの使用例を詳しく解説

PHPでのWebSocketの使用例を詳しく解説

May 15, 2018 pm 05:41 PM

WebSocketとは何ですか?

WebSocket は、非永続的な http と比較される永続的なプロトコルです。 簡単な例を挙げると、 http1.0 のライフサイクルはリクエスト、つまりリクエストとレスポンスによって定義されます。 http の場合、クライアントとサーバー間のセッションは http1.1 で終了します。改善されました。つまり、キープアライブが追加されました。つまり、複数のリクエスト要求と複数の応答受け入れ操作を 1 つの http 接続で実行できるようになりました。ただし、リアルタイム通信では、HTTP リクエストはクライアントによってのみ開始され、サーバーは情報を返すことができません。つまり、サーバーはクライアントに情報を積極的にプッシュすることができず、要件を満たすことができません。リアルタイム通信のこと。 WebSocket は永続的な接続を実行できます。つまり、クライアントはハンドシェイクのみを実行する必要があり、成功後にデータ通信を続行できます。WebSocket はクライアントとサーバー間の全二重通信を実装していること、つまりサーバーがデータ通信を継続できることは注目に値します。データがクライアントにプッシュされるときにアクティブに通信します。

次の図は、クライアントとサーバーの間で WebSocket 接続を確立するときのハンドシェイク部分を示しています。ノードによって提供されるネット モジュールは、開発者が使用するだけですでにカプセル化されているため、ノード内で非常に簡単に完了できます。接続の確立に対処することなく、データの相互作用を考慮する必要があります。

PHPでのWebSocketの使用例を詳しく解説

ソケット確立時のクライアントとサーバー間のハンドシェイク、つまりリクエストとレスポンスの会話内容

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 を作成するのは非常に簡単です。コードは次のとおりです。 PHP プログラミングの入門からマスターまでの一連のチュートリアル

以上がPHPでのWebSocketの使用例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles