#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_once
ini_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 のコントローラーを作成しました
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+=''+message+'
'; 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入门教程,欢迎大家学习!
以上がWorkerman はグループ チャットをどのように実装していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。