Workerman はグループ チャットをどのように実装していますか?
#1. 基本
1. workerman
workerman は、中国人によって開発された良心的で高性能な PHP ソケット サーバー フレームワークです。世界最大の同性出会い系ゲイハブで 4,000 人以上のスターがいます。プラットフォームの大きさは想像できると思いますが、牛 X です。
単独でデプロイすることも、MVC フレームワーク (TP、laravel など) に統合することもでき、非常に実用的で、優れた同時実行効果があると言えます。
公式ウェブサイトのアドレス:
http://www.workerman.net/workerman
ゲイハブのアドレス:
https://github.com/ walkor /workerman/
2.gateway-worker
gateway-worker (以下、gateway) は、workerman をベースに開発された TCP ロングコネクションフレームワークであり、利用されています。 TCP 長時間接続アプリケーションを迅速に開発します。
オンライン チャットは通常、通信を維持するために長い接続を使用します。ワーカーマンを使用しても同じ効果が得られますが、ゲートウェイの方が便利で高速です。
(投票によって構築されたチャット ルームはアウトになりました、それも...)
gayhub アドレス:
https://github.com/walkor/GatewayWorker
3.gatewayClient
gateClient は、ワーカーまたはゲートウェイがユーザーをグループ化し、ユーザーに情報を送信するのを支援するために使用されるコンポーネントです。オリジナルを変換します。 システム UID とクライアント ID がバインドされます。
ゲイハブのアドレス:
https://github.com/walkor/GatewayClient
2. 理論:
1. MVC システムとの統合の原則:
既存の mvc フレームワーク プロジェクトと GatewayWorker の独立したデプロイメントは、次のことを行います。相互に干渉しません;
##·すべてのビジネス ロジックは、Web サイトのページから mvc フレームワークへの post/get によって完了します;
##· GatewayWorker はクライアントからのデータを受け入れません。つまり、GatewayWorker はビジネス ロジックを処理せず、GatewayWorker は一方向のプッシュ チャネルとしてのみ使用されます。
· mvc フレームワークがブラウザーにデータをアクティブにプッシュする必要がある場合にのみ、ゲートウェイ API (GatewayClient) が mvc フレームワークで呼び出され、プッシュを完了します。
2. 実装手順:
(1) Web サイトのページが GatewayWorker との WebSocket 接続を確立します; (2) GatewayWorker は、ページが接続を開始します 対応する接続の client_id が Web サイトのページに送信されるとき; (3) Web サイトのページが client_id を受信した後、ajax リクエスト (bind.php であると仮定します) をトリガーし、 client_id を mvc バックエンドに; (4) mvc バックエンドの binding.php が client_id を受け取った後、GatewayClient を使用して Gateway::bindUid($client_id, $uid) を呼び出し、client_id を現在の uid (ユーザー) にバインドします。 ID またはクライアントの一意の識別子)。グループまたはグループ送信関数がある場合は、Gateway::joinGroup($client_id, $group_id) を使用して、対応するグループに client_id を追加することもできます; (5) ページによって開始されたすべてのリクエストは、 mvc に直接 post/get フレームワークはメッセージの送信を含む統合処理を処理します; (6) mvc フレームワークが業務処理中に特定の uid または特定のグループにデータを送信する必要がある場合、GatewayClient インターフェイスを直接呼び出しますGateway::sendToUid Gateway::sendToGroup 送信されるまで待ちます。#3. 実装 - ゲートウェイの構成と開始: #1. ゲートウェイのダウンロードと使用
単独で使用することも、フレームワークのパブリック ディレクトリに配置することもできます。
2. start.php の編集
start.php は、php コマンド ラインを使用して実行する必要があります。
#require_onceini_set('display_errors', 'on');
use Workerman\Worker;
if(strpos(strtolower(PHP_OS), 'win') === 0)
{
exit("start.php not support windows, please use start_for_win.bat\n");
}
// 检查扩展
if(!extension_loaded('pcntl'))
{
exit("Please install pcntl extension.See http://doc3.workerman.net/appendices/install-extension.html\n");
}
if(!extension_loaded('posix'))
{
exit("Please install posix extension.See http://doc3.workerman.net/appendices/install-extension.html\n");
}
// 标记是全局启动
define('GLOBAL_START', 1);
// 注意这里的路径
require_once '../vendor/autoload.php';
// 加载所有Applications/*/start.php,以便启动所有服务
foreach(glob(__DIR__.'/Applications/*/start*.php') as $start_file)
{
require_once $start_file;
}
// 运行所有服务
Worker::runAll();
ApplicationsYourAppstart_gateway.php
// 部分文件内容 //将$gateway改成websocket协议,demo中是text协议 $gateway = new Gateway("websocket://0.0.0.0:8282");
4.start_register.php
で編集できます。 ·start_register.php の $register はテキスト プロトコルである必要があり、ポートは
// register 服务必须是text协议 $register = new Register('text://192.168.124.125:1238');
5 であることに注意してください。設定後、start.php## を開きます。 #$ php start.php start
4. 実装 - サーバー開発前述したように、ユーザーはゲートウェイの onConnect($client_id) を経由するのは、接続がトリガーされ、すべての業務操作が Web システムに実装される必要があります。
そこで、これらのビジネスを処理するために GatewayServer.php のコントローラーを作成しました
<?php /** * Author: root * Date : 17-3-27 * time : 上午12:32 */ namespace app\index\controller; use GatewayClient\Gateway; use think\Cache; use think\Controller; use think\Request; use think\Session; class GatewayServer extends Controller { public function _initialize(){ } public function bind(Request $request) { // 用户连接websocket之后,绑定uid和clientid,同时进行分组,根据接收到的roomid进行分组操作 $userGuid=Session::get('loginuser'); $roomId=intval(trimAll($request->post('room'))); $clientId=trimAll($request->post('client_id')); // 接受到上面的三个参数,进行分组操作 Gateway::$registerAddress = '192.168.124.125:1238'; // client_id与uid绑定 // Gateway::bindUid($clientId, $userGuid); // 加入某个群组(可调用多次加入多个群组) 将clientid加入roomid分组中 Gateway::joinGroup($clientId, $roomId); // 返回ajax json信息 $dataArr=[ 'code'=>$userGuid, 'status'=>true, 'message'=>'Group Success' ]; return json()->data($dataArr); } // 接受用户的信息 并且发送 public function send(Request $request){ Gateway::$registerAddress = '192.168.124.125:1238'; // 获得数据 $userGuid=Session::get('loginuser'); $roomId=intval(trimAll($request->post('room'))); $message=trim($request->post('message')); // 获得用户的称呼 $userInfo=Cache::get($userGuid); // 将用户的昵称以及用户的message进行拼接 $nickname=$userInfo['nickname']; $message=$nickname." : ".$message; // 发送信息应当发送json数据,同时应该返回发送的用户的guid,用于客户端进行判断使用 $dataArr=json_encode(array( 'message' => $message, 'user'=>$userGuid )); // 向roomId的分组发送数据 Gateway::sendToGroup($roomId,$dataArr); } }
5. 実装とクライアントの接続と送受信:ゲートウェイを開いたら、ブラウザがアクセスするのを監視して待つことができます。
クライアントはここで js を使用して WebSocket を監視します:
1。WebSocket へのクライアント接続を処理し、メッセージを受信するために使用されます// 这个示例和gateway官网的示例是一样的
// 监听端口
ws = new WebSocket("ws://192.168.124.125:8282");
// 绑定分组的ajaxURL
var ajaxUrl="{:url('/gateway/bind')}";
// 发送消息的ajaxURL
var ajaxMsgUrl="{:url('/gateway/send')}";
// 通过房间号进行分组
var roomId="{$roomInfo.guid}";
// 获取当前登录用户的guid,用于标识是自己发送的信息
var loginUser="{$userLoginInfo.guid}";
// 获取当前房间号的主播的uid,用于标识是主播发送的信息
var roomUser="{$roomInfo.uid}";
// 服务端主动推送消息时会触发这里的onmessage
ws.onmessage = function(e){
// console.log(e.data);
// json数据转换成js对象
var data = eval("("+e.data+")");
var type = data.type || '';
switch(type){
// Events.php中返回的init类型的消息,将client_id发给后台进行uid绑定
case 'init':
// 利用jquery发起ajax请求,将client_id发给后端进行uid绑定
$.post(ajaxUrl, {client_id: data.client_id,room:roomId}, function(data){
// console.log(data);
}, 'json');
break;
// 当mvc框架调用GatewayClient发消息时直接alert出来
default :
// 如果登陆用户的guid和数据发送者的guid一样,则使用不同的颜色(只能自己看到)
if(loginUser == data.user){
addMsgToHtml(data.message,'#F37B1D');
break;
// 如果发送者的guid和主播uid一样,则对所有的显示都增加一个[主播标识]
}else if(data.user==roomUser){
addMsgToHtml("[主播] "+data.message,'#0e90d2');
break;
}else{
// 其他的就正常发送消息
addMsgToHtml(data.message,'#333');
}
break;
}
};
// 向面板中增加新接收到的消息
// 其中message是消息,color是显示的颜色,主要为了区分主播以及自己发送的消息和系统提示
function addMsgToHtml(message,color) {
if(message.length==0){
return false;
}
// 获取html,并且增加html
var obj=$("#room-viedo-chat");
var html=obj.html();
//
html+='<p><font color="'+color+'">'+message+'</p>';
obj.html(html);
// 将滚动条滚动到底部
obj.scrollTop(obj[0].scrollHeight);
}
// 发送聊天消息
function sendMsg(){
// 去掉onclick属性,使得3秒之内无法发送信息
$("#sendMsgBox").attr('onclick','');
var btnObj=$("#sendMsgBtn");
var tmpNum=3;
var tmpMsg=tmpNum+' S';
btnObj.text(tmpMsg);
var int =setInterval(function () {
// 3秒之内不能发送信息,3秒之后,回复onclick属性以及文字
if(tmpNum==0){
tmpMsg="发送";
clearInterval(int);
btnObj.text("发送");
$("#sendMsgBox").attr('onclick','sendMsg()');
}
btnObj.text(tmpMsg);
tmpNum-=1;
tmpMsg=tmpNum+' S';
},1000);
var message=$("#chattext").val().trim();
var obj=$("#room-viedo-chat");
var html=obj.html();
if(message.length>=140){
// 获取html,并且增加html
addMsgToHtml("系统提示: 不能超过140个字符","#8b0000");
return false;
}
if(message.length==0){
// 获取html,并且增加html
addMsgToHtml("系统提示: 不能发送空消息","#8b0000");
return false;
}
// 向server端发送ajax请求
$.post(ajaxMsgUrl,{room:roomId,message:message},function (data) {
},'json');
return false;
}
六、效果: 效果很明显: ·系统提示是单独的颜色 ·本人发布的,是自己能够分辨的橙色 ·主播发布的是蓝色,同时前面有[主播]标识 ·看其他人发布的就是普通的颜色 PHP中文网,有大量免费的workerman入门教程,欢迎大家学习!<!--chat box start -->
<div class=" am-u-md-12 am-u-lg-12 room-viedo-chat" id="room-viedo-chat" style="font-size:14px;">
</div>
<div class="am-u-md-12 am-u-lg-12 room-viedo-chat-button-box">
<div class="left-div">
<textarea name="chattext" id="chattext" placeholder="输入聊天内容..."></textarea>
</div>
<div class="am-btn am-btn-default right-div am-text-center"onclick="sendMsg();"id="sendMsgBox">
<span class="" id="sendMsgBtn">
发送
</span>
</div>
</div>
<!--chat box end -->
以上がWorkerman はグループ チャットをどのように実装していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









1. 携帯電話で WeChat ソフトウェアを見つけて開きます。 2. グループから削除する必要があるグループ チャットをクリックして、チャット ページに入ります。 3. チャット ページの右上隅にある [...] をクリックします。 4. 下にスワイプしてグループ メンバーの後ろにある [-] を見つけてクリックします。

Workerman ドキュメントでファイルのアップロードとダウンロードを実装するには、特定のコード サンプルが必要です はじめに: Workerman は、シンプル、効率的、使いやすい高性能 PHP 非同期ネットワーク通信フレームワークです。実際の開発では、ファイルのアップロードとダウンロードが一般的な機能要件となりますが、この記事では、Workerman フレームワークを使用してファイルのアップロードとダウンロードを実装する方法と、具体的なコード例を紹介します。 1. ファイル アップロード: ファイル アップロードとは、ローカル コンピューター上のファイルをサーバーに転送する操作を指します。以下が使用されます

ソーシャル ソフトウェアである QQ を使用すると、グループ チャットを通じて他のユーザーが自分を友達として追加できます。グループチャットで友達に追加する設定方法と有効にする方法を紹介します。モバイル QQ インターフェイスに入ったら、左上隅の個人アバターをクリックしてメニュー ページを開き、ページの左下隅にある「設定」機能をクリックして設定インターフェイスに入ります。 2. 設定ページに移動したら、「プライバシー」項目をクリックして選択します。 3. 次に、プライバシーページに「友達に追加する方法」があるので、クリックして入力します。 4. 新しいページで、[次の方法で私を友達として追加できます] の下にオプションのリストが表示されます。[グループ チャット] の後ろにある対応するスイッチ ボタンをクリックします。ボタンが青色に設定されている場合は、ボタンがオンになっていることを意味し、他のユーザーもグループ チャットに参加できるようになります。

Swoole と Workerman はどちらも高性能の PHP サーバー フレームワークです。 Swoole は、非同期処理、優れたパフォーマンス、スケーラビリティで知られており、多数の同時リクエストと高スループットを処理する必要があるプロジェクトに適しています。 Workerman は、使いやすさや同時実行量が少ないプロジェクトに適した直感的な API を備え、非同期モードと同期モードの両方の柔軟性を提供します。

Workerman ドキュメントの基本的な使用方法の実装方法の紹介: Workerman は、開発者が同時実行性の高いネットワーク アプリケーションを簡単に構築できるようにする高性能 PHP 開発フレームワークです。この記事では、インストールと構成、サービスとリスニング ポートの作成、クライアント リクエストの処理など、Workerman の基本的な使用方法を紹介します。そして、対応するコード例を示します。 1. Workerman のインストールと構成 コマンド ラインに次のコマンドを入力して、Workerman をインストールします。

Workerman 開発: UDP プロトコルに基づくリアルタイム ビデオ通話 概要: この記事では、Workerman フレームワークを使用して、UDP プロトコルに基づくリアルタイム ビデオ通話機能を実装する方法を紹介します。 UDP プロトコルの特性を深く理解し、コード例を通じて、シンプルだが完全なリアルタイム ビデオ通話アプリケーションを構築する方法を示します。はじめに: ネットワーク通信において、リアルタイムのビデオ通話は非常に重要な機能です。従来の TCP プロトコルでは、リアルタイム性の高いビデオ通話を実装する場合、伝送遅延などの問題が発生する可能性があります。そしてUDP

Workerman を使用して高可用性ロード バランシング システムを構築する方法には、特定のコード サンプルが必要です。現代のテクノロジーの分野では、インターネットの急速な発展に伴い、大量の同時リクエストを処理する必要がある Web サイトやアプリケーションがますます増えています。高可用性と高性能を実現するために、負荷分散システムは不可欠なコンポーネントの 1 つになっています。この記事では、PHP オープン ソース フレームワーク Workerman を使用して高可用性負荷分散システムを構築する方法を紹介し、具体的なコード例を示します。 1. ワーカーマンワークの紹介

Workerman ドキュメントでリバース プロキシ機能を実装するには、具体的なコード例が必要です はじめに: Workerman は、豊富な機能と強力なパフォーマンスを提供する高性能 PHP マルチプロセス ネットワーク通信フレームワークであり、Web のリアルタイム通信や長時間の通信で広く使用されています。接続、サービス シナリオ。このうち、Workermanはリバースプロキシ機能もサポートしており、サーバーが外部サービスを提供する際の負荷分散や静的リソースのキャッシュを実現できます。この記事ではWorkermanを利用してリバースプロキシ機能を実装する方法を紹介します。
