<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ? 基礎文檔:[Workerman · ThinkPHP5.0完全開發手冊 · 看云](http://www.hmoore.net/manual/thinkphp5/235128 "Workerman · ThinkPHP5.0完全開發手冊 · 看云") 在線測試地址:[EasySwoole-WebSocket在線測試工具](http://www.easyswoole.com/wstool.html "EasySwoole-WebSocket在線測試工具") 一、安裝擴展包? ?composer require topthink/think-worker?? 遇到報錯:不能安裝,參考:[tp5 workerman安裝不上解決方法 - 知乎](https://zhuanlan.zhihu.com/p/127921818 "tp5 workerman安裝不上解決方法 - 知乎")? 直接執行:composer require topthink/think-worker=1.0.\*? ? ?即可成功 二、新建 server.php?? ~~~php #!/usr/bin/env php <?php define('APP_PATH', __DIR__ . '/application/'); define('BIND_MODULE','push/Worker'); // 加載框架引導文件 require __DIR__ . '/thinkphp/start.php'; ~~~ ![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動") 三、新建Worker.php? ??php think make:controller push/Worker? ?即可,將里面的內容替換如下所示: ~~~php <?php namespace app\push\controller; use think\Controller; use think\Request; use think\worker\Server; use think\Cache; class Worker extends Server { protected $socket = 'websocket://0.0.0.0:2346'; protected $processes = 1; protected $uidConnections = array(); static $count = 0; /** * 收到信息 * @param $connection * @param $data */ public function onMessage($connection, $data) { $retdata=json_decode($data,true); $uid=$retdata['id']; $message=$retdata['msg']; if(isset($this->uidConnections[$uid])) { $connection = $this->uidConnections[$uid]; $connection->send($message); // return true; } $connection->send('我收到你的信息了333='.$retdata['msg']); } /** * 當連接建立時觸發的回調函數 * @param $connection */ public function onConnect($connection) { $this->uidConnections[$connection->id] = $connection; $connection->send('你連接了我='.$connection->id); } // 針對uid推送數據 public function sendMessageByUid($uid, $message) { if(isset($this->uidConnections[$uid])) { $connection = $this->uidConnections[$uid]; $connection->send($message); return true; } return false; } /** * 當連接斷開時觸發的回調函數 * @param $connection */ public function onClose($connection) { } /** * 當客戶端的連接上發生錯誤時觸發 * @param $connection * @param $code * @param $msg */ public function onError($connection, $code, $msg) { echo "error $code $msg\n"; } /** * 每個進程啟動 * @param $worker */ public function onWorkerStart($worker) { } } ~~~ ![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動") ~~~html 四、執行 php server.php start 遇到禁用函數就去對應的PHP里面把禁用函數刪除 (此命令可以放到Supervisor的守護進程里面去),并且查看端口是否運行,寶塔里面也要放行對應的端口 2346 ~~~ ![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動") 配置安全組參考:?[回答阿里云websocket配置問題\_慕課手記](https://www.imooc.com/article/72220 "回答阿里云websocket配置問題_慕課手記")? ? 這個很關鍵 測試遠程連接:[http://www.voidcn.com/article/p-nifcqskk-buc.html](http://www.voidcn.com/article/p-nifcqskk-buc.html "http://www.voidcn.com/article/p-nifcqskk-buc.html")? ? ? ?telnet localhost 2346? ? ? ? ?localhost改成外網ip即可,這個走通了,前端就能直接連接了 linux 退出Telnet命令? ??先輸入命令:CTRL+\]然后再輸入命令:quit 五、前端代碼 ~~~html <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Title</title> </head> <body> <script> ws = new WebSocket("ws://118.**.***.207:2346"); ws.onopen = function() { console.log("連接成功"); ws.send('tom'); console.log("給服務端發送一個字符串:tom"); }; ws.onmessage = function(e) { console.log("收到服務端的消息:" + e.data); }; </script> </body> </html> ~~~ ![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動") # l 六、前端開兩個端口即可進行相互通訊: ~~~javascript ws.send('{"id":"2","msg":"21111111111110"}'); ~~~ ![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動") 最終效果如下所示: ![](https://img-blog.csdnimg.cn/20201119134210179.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MDUwMzYw,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動")?編輯![](https://img-blog.csdnimg.cn/20201119134223133.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MDUwMzYw,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動")?編輯 重點在這:因為在這里需要用到服務端給客戶端推送,用到了text服務 ## WorkerMan中php后端及時推送消息給客戶端 參考連接:[WorkerMan中php后端及時推送消息給客戶端-Workerman-PHP中文網](https://www.php.cn/workerman/442367.html "WorkerMan中php后端及時推送消息給客戶端-Workerman-PHP中文網") php后端及時推送消息給客戶端 原理: 1、建立一個websocket Worker,用來維持客戶端長連接 2、websocket Worker內部建立一個text Worker 3、websocket Worker 與 text Worker是同一個進程,可以方便的共享客戶端連接 4、某個獨立的php后臺系統通過text協議與text Worker通訊 5、text Worker操作websocket連接完成數據推送 代碼及步驟 ~~~php push.php <?php use Workerman\Worker; require_once './vendor/workerman/workerman/Autoloader.php'; // 初始化一個worker容器,監聽1234端口 $worker = new Worker('websocket://0.0.0.0:1234');// /* * 注意這里進程數必須設置為1,否則會報端口占用錯誤 * (php 7可以設置進程數大于1,前提是$inner_text_worker->reusePort=true) */ $worker->count = 1; // worker進程啟動后創建一個text Worker以便打開一個內部通訊端口 $worker->onWorkerStart = function($worker) { // 開啟一個內部端口,方便內部系統推送數據,Text協議格式 文本+換行符 $inner_text_worker = new Worker('text://0.0.0.0:5678'); $inner_text_worker->onMessage = function($connection, $buffer) { // $data數組格式,里面有uid,表示向那個uid的頁面推送數據 $data = json_decode($buffer, true); $uid = $data['uid']; // 通過workerman,向uid的頁面推送數據 $ret = sendMessageByUid($uid, $buffer); // 返回推送結果 $connection->send($ret ? 'ok' : 'fail'); }; // $connection->send('你好,你連接我了'); // ## 執行監聽 ## $inner_text_worker->listen(); }; // 新增加一個屬性,用來保存uid到connection的映射 $worker->uidConnections = array(); // 當有客戶端發來消息時執行的回調函數 $worker->onMessage = function($connection, $data) { $data=json_decode($data,true); $connection->send('99897'); global $worker; // 判斷當前客戶端是否已經驗證,既是否設置了uid if(!isset($connection->uid)) { // 沒驗證的話把第一個包當做uid(這里為了方便演示,沒做真正的驗證) $connection->uid = $data['id']; /* 保存uid到connection的映射,這樣可以方便的通過uid查找connection, * 實現針對特定uid推送數據 */ $worker->uidConnections[$connection->uid] = $connection; $connection->send('9980'.$data['msg']); return; }else{ $connection->send('998123'); } }; // 當有客戶端連接斷開時 $worker->onClose = function($connection) { global $worker; if(isset($connection->uid)) { // 連接斷開時刪除映射 unset($worker->uidConnections[$connection->uid]); } }; // 向所有驗證的用戶推送數據 function broadcast($message) { global $worker; foreach($worker->uidConnections as $connection) { $connection->send($message); } } // 針對uid推送數據 function sendMessageByUid($uid, $message) { global $worker; if(isset($worker->uidConnections[$uid])) { $connection = $worker->uidConnections[$uid]; $connection->send($message); return true; } return false; } // 運行所有的worker Worker::runAll(); 啟動后端服務 php push.php start -d 前端接收推送的js代碼 <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Title</title> </head> <body> <script> var ws = new WebSocket('ws://118.**.**.207:1234'); ws.onopen = function(){ var uid = 'uid1'; ws.send(uid); console.log("給服務端發送一個字符串:"+uid); }; ws.onmessage = function(e){ // alert(e.data); console.log("收到服務端的消息:" + e.data); }; </script> </body> </html> 后端推送消息的代碼 // 建立socket連接到內部推送端口 $client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1); // 推送的數據,包含uid字段,表示是給這個uid推送 $data = array('uid'=>'uid1', 'percent'=>'88%'); // 發送數據,注意5678端口是Text協議的端口,Text協議需要在數據末尾加上換行符 fwrite($client, json_encode($data)."\n"); // 讀取推送結果 echo fread($client, 8192); ~~~ ![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動") 后端推送消息的代碼和push.php監聽同一個端口 push.php和前端監聽同一個websocket端口 通過后端推送消息的代碼向push.php推送數據, push.php接受到數據后通過處理 利用websocket往前端推送數據 參考: [WorkerMan中php后端及時推送消息給客戶端](https://www.php.cn/workerman/442367.html "WorkerMan中php后端及時推送消息給客戶端") [workerman 內部系統推送數據](https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=workerman%20%20%E5%86%85%E9%83%A8%E7%B3%BB%E7%BB%9F%E6%8E%A8%E9%80%81%E6%95%B0%E6%8D%AE&oq=php%2520%25E8%25BF%259E%25E6%258E%25A5websocket%2520%25E5%258F%2591%25E9%2580%2581%25E6%25B6%2588%25E6%2581%25AF&rsv_pq=ad92a8a1000d2a5c&rsv_t=e510BtJ8mcMjXrby2cxwKlWpOqVkeKijK0iPv%2FBLWnxZSEO6u1pQGrcICIA&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_btype=t&inputT=12542&rsv_sug3=97&rsv_sug1=64&rsv_sug7=100&rsv_sug2=0&rsv_sug4=13298 "workerman 內部系統推送數據") [Centos7開放端口及查看端口](https://www.cnblogs.com/heqiuyong/p/10460150.html "Centos7開放端口及查看端口") ? ?
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看