この記事ではphp+websocketで簡単なチャットルームを構築する実践を中心に説明していますので、必要な方は記事内のphpとwebsocketの内容を参照してください。
この記事の例では、WebSocket に基づいて PHP で単純なチャット ルームを構築する実践について説明します。皆さんの参考に共有してください。詳細は以下のとおりです:
1. はじめに
会社のゲームに簡易チャットルームがあることに気づき、PHPを使って簡易チャットを作ってみようと思いました。部屋。そこで、さまざまな情報を収集し、ドキュメントを読み、事例を探し、簡単なチャット ルームを自分で書きました。
http 接続は、短い接続と長い接続に分けられます。短い接続は通常、ajax を使用して実装でき、長い接続は WebSocket です。短い接続は実装が比較的簡単ですが、消費するリソースが多すぎます。 Websocket は効率的ですが、互換性に関していくつかの問題があります。 Websocket は html5 のリソースです
2. フロントエンド
WebSocket の実装は非常にシンプルで簡単です
3. Websocket の難しさは主に次のとおりです。バックエンド内
3.1 websocket接続プロセスwebsocket通信図 これは、クライアントとサーバー間の単純な通信図です。PHPが主に行うことは、暗号化キーを受け取り、それを返してソケットの作成とハンドシェイク操作を完了することです
。
下の図はサービスの詳細です エンド側のWebSocket処理のフローチャート
接続を待機しているソケットのプロセスをハングアップします
- ハンドシェイクがない場合はハンドシェイク操作を実行する ハンドシェイクがある場合、データは解析されて出力用のバッファーに書き込まれます
- 以下はサンプルコードです (クラスを書いたので、コードは関数の段落に従って分割されています)。記事の最後には、github アドレスと私が遭遇したいくつかの落とし穴が記載されています
- 1. まず、ソケットを作成します
//连接websocket var ws = new WebSocket("ws://127.0.0.1:8000"); //成功连接websoc的时候 ws.onopen = function(){} //成功获取服务端输出的消息 ws.onmessage = function(e){} //连接错误的时候 ws.onerror = function(){} //向服务端发送数据 ws.send();
2. ソケットを配列に配置します
//建立套接字 public function createSocket($address,$port) { //创建一个套接字 $socket= socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //设置套接字选项 socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1); //绑定IP地址和端口 socket_bind($socket,$address,$port); //监听套接字 socket_listen($socket); return $socket; }
3. 中断されたプロセスはソケット配列を走査し、主な操作はここで完了します
public function __construct($address,$port) { //建立套接字 $this->soc=$this->createSocket($address,$port); $this->socs=array($this->soc); }4. WebSocket のコンテンツを受信し、Sec-WebSocket-Key からキーを取得するには: そして渡します。 バッファーに書き込まれた暗号化アルゴリズムはクライアントによって検証されます (自動検証には弊社の処理は必要ありません)
public function run(){ //挂起进程 while(true){ $arr=$this->socs; $write=$except=NULL; //接收套接字数字 监听他们的状态 socket_select($arr,$write,$except, NULL); //遍历套接字数组 foreach($arr as $k=>$v){ //如果是新建立的套接字返回一个有效的 套接字资源 if($this->soc == $v){ $client=socket_accept($this->soc); if($client <0){ echo "socket_accept() failed"; }else{ // array_push($this->socs,$client); // unset($this[]); //将有效的套接字资源放到套接字数组 $this->socs[]=$client; } }else{ //从已连接的socket接收数据 返回的是从socket中接收的字节数 $byte=socket_recv($v, $buff,20480, 0); //如果接收的字节是0 if($byte<7) continue; //判断有没有握手没有握手则进行握手,如果握手了 则进行处理 if(!$this->hand[(int)$client]){ //进行握手操作 $this->hands($client,$buff,$v); }else{ //处理数据操作 $mess=$this->decodeData($buff); //发送数据 $this->send($mess,$v); } } } } }5.クライアントのデータを解析します (ここでは暗号化していません。必要に応じて自分で暗号化できます)
7. メソッドを実行します
。 github アドレス git@github.com:rsaLive/websocket.git
エラーがある場合は、プロンプトが表示されます
②サーバー経由でHTMLファイルにアクセスします
各判断をマークして、コードが実行されているセクションをコンソールで確認できます
しかし、コードを変更した後は毎回スクリプトphpserver.phpを再実行する必要があります
1. サーバーとのソケットの初期化時にデータを送信する (サーバーとの最初の検証ハンドシェイク中にコンテンツは送信できません)
2. 検証済みの場合 ただし、この状況はクライアントが検証済みの場合にも発生します。送信されない、または送信されたメッセージが空であるため、接続されているソケットのデータを確認する必要があります
public function hands($client,$buff,$v) { //提取websocket传的key并进行加密 (这是固定的握手机制获取Sec-WebSocket-Key:里面的key) $buf = substr($buff,strpos($buff,'Sec-WebSocket-Key:')+18); //去除换行空格字符 $key = trim(substr($buf,0,strpos($buf,"\r\n"))); //固定的加密算法 $new_key = base64_encode(sha1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11",true)); $new_message = "HTTP/1.1 101 Switching Protocols\r\n"; $new_message .= "Upgrade: websocket\r\n"; $new_message .= "Sec-WebSocket-Version: 13\r\n"; $new_message .= "Connection: Upgrade\r\n"; $new_message .= "Sec-WebSocket-Accept: " . $new_key . "\r\n\r\n"; //将套接字写入缓冲区 socket_write($v,$new_message,strlen($new_message)); // socket_write(socket,$upgrade.chr(0), strlen($upgrade.chr(0))); //标记此套接字握手成功 $this->hand[(int)$client]=true; }
関連する推奨事項:
PHP のランダムな赤い封筒アルゴリズムの詳細な説明
以上がWebSocket に基づいてチャット ルームを構築する PHP の実践の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

セッション固定攻撃を防ぐための効果的な方法には、次のものがあります。1。ユーザーがログインした後にセッションIDを再生します。 2。安全なセッションID生成アルゴリズムを使用します。 3。セッションタイムアウトメカニズムを実装します。 4。HTTPSを使用したセッションデータを暗号化します。これらの措置は、セッションの固定攻撃に直面するときにアプリケーションが破壊されないようにすることができます。

セッションのない認証の実装は、サーバー側のセッションストレージなしですべての必要な情報がトークンに保存されるトークンベースの認証システムであるJSonWebtokens(JWT)を使用することで実現できます。 1)JWTを使用してトークンを生成および検証する、2)トークンが傍受されるのを防ぐためにHTTPSが使用されることを確認する、3)クライアント側にトークンを安全に保存する、4)改ざんを防ぐためにサーバー側のトークンを検証する、5)短期アクセスや長期的なリフレイを使用するなどのトークンの取り消しメカニズムを実装する。

PHPセッションのセキュリティリスクには、主にセッションハイジャック、セッションの固定、セッション予測、およびセッション中毒が含まれます。 1。HTTPSを使用してCookieを保護することにより、セッションハイジャックを防ぐことができます。 2。ユーザーがログインする前にセッションIDを再生することにより、セッションの固定を回避できます。3。セッションの予測は、セッションIDのランダム性と予測不可能性を確保する必要があります。 4.セッションの中毒は、セッションデータを確認およびフィルタリングすることで防ぐことができます。

PHPセッションを破壊するには、最初にセッションを開始してから、データをクリアしてセッションファイルを破壊する必要があります。 1。Session_start()を使用してセッションを開始します。 2。Session_unset()を使用して、セッションデータをクリアします。 3.最後に、session_destroy()を使用してセッションファイルを破壊して、データのセキュリティとリソースのリリースを確保します。

PHPのデフォルトセッションの保存パスを変更する方法は?次の手順で達成できます。Session_save_path( '/var/www/sessions'); session_start(); PHPスクリプトで、セッション保存パスを設定します。 session.save_path = "/var/www/sessions"をphp.iniファイルに設定して、セッションの保存パスをグローバルに変更します。 memcachedまたはredisを使用して、ini_set( 'session.save_handler'、 'memcached')などのセッションデータを保存します。 ini_set(

tomodifydatainaphpsession、starthessession withsession_start()、$ _sessiontoset、modify、orremovevariables.1)startthessession.2)

配列はPHPセッションに保存できます。 1。セッションを開始し、session_start()を使用します。 2。配列を作成し、$ _Sessionで保存します。 3. $ _Sessionを介して配列を取得します。 4.セッションデータを最適化してパフォーマンスを向上させます。

PHPセッションガベージコレクションは、有効期限が切れたセッションデータをクリーンアップするために確率メカニズムを通じてトリガーされます。 1)構成ファイルにトリガー確率とセッションのライフサイクルを設定します。 2)Cronタスクを使用して、高負荷アプリケーションを最適化できます。 3)データの損失を避けるために、ごみ収集の頻度とパフォーマンスのバランスを取る必要があります。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

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

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

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

ホットトピック









