workerman实现聊天室

薄洪涛6年前PHP1125
Workerman的一些应用方向如下
1、即时通讯类 例如网页即时聊天、即时消息推送、微信小程序、手机app消息推送、PC软件消息推送等等 [示例 workerman-chat聊天室 、 web消息推送 、 小蝌蚪聊天室]
2、物联网类 例如Workerman与打印机通讯、与单片机通讯、智能手环、智能家居、共享单车等等。 [客户案例如 易联云、易泊时代等]
3、游戏服务器类 例如棋牌游戏、MMORPG游戏等等。[示例 browserquest-php]
4、SOA服务化 利用Workerman将现有业务不同功能单元封装起来,以服务的形式对外提供统一的接口,达到系统松耦合、易维护、高可用、易伸缩。[示例 workerman-json-rpc、 workerman-thrift]
5、其它服务器软件 例如 GatewayWorkerPHPSocket.IOhttp代理sock5代理分布式通讯组件分布式变量共享组件消息队列、DNS服务器、WebServer、CDN服务器、FTP服务器等等
6、中间件 例如异步MySQL组件异步redis组件异步http组件异步消息队列组件异步dns组件文件监控组件,还有很多第三方开发的组件框架等等
原理:
worker是workweman中的基本容器,每个worker都可以开启多个进程监听端口并使用特定的协议通讯,类似nginx监听端口;每个Worker进程独立运作,采用Epoll(需要装event扩展)+非阻塞IO,每个Worker进程都能做上万的客户端连接,并处理这些连接上发来的数据。主进程为了保持稳定性,只负责监控子进程,不负责接收数据也不做任何业务逻辑。

image.png

image.png




现在我们就可以做一个聊天室,关键代码如下:

<?php
/**
 * Created by PhpStorm.
 * User: John
 * Date: 2019/4/3
 * Time: 13:19
 */

use Workerman\Worker;

require __DIR__.'/../Workerman-framework/Autoloader.php';


// 当客户端连上来时分配uid,并保存连接,并通知所有客户端
function handle_connection($connection)
{
   
}

// 当客户端发送消息过来时,转发给所有人
function handle_message($connection, $data)
{
    global $text_worker;
    foreach($text_worker->connections as $conn)
    {
        $conn->send($data);
    }
}

// 当客户端断开时,广播给所有客户端
function handle_close($connection)
{

}


// 创建一个文本协议的Worker监听2347接口
$text_worker = new Worker("websocket://0.0.0.0:2347");

// 只启动1个进程,这样方便客户端之间传输数据
$text_worker->count = 1;

$text_worker->onConnect = 'handle_connection';
$text_worker->onMessage = 'handle_message';
$text_worker->onClose = 'handle_close';

Worker::runAll();

前端代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div style="margin: 0 auto;width: 800px">
    <h2>聊天室</h2>
    <textarea type="text" style="border: 1px solid black;width: 800px;height: 200px;" id="his"></textarea>
    <input type="text" style="width:740px" id="sendMsg">&nbsp;<button id="send">发送</button>
</div>
</body>
</html>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>

    $(function () {
        var ws = new WebSocket("ws://127.0.0.1:2347");
        var storage = window.localStorage;
        if(!storage.getItem('name')){
            var name=prompt("请输入您的名字","");
            storage.setItem('name',name);
        }
       $('#send').click(function () {
           msg = $('#sendMsg').val();
           $('#sendMsg').val('');
           ws.send(storage.getItem('name')+':'+msg);
       });
        ws.onopen = function() {
            $('#his').append("服务器连接成功.....");
            $('#his').append("\n");
        };
        ws.onmessage = function(e) {
            $('#his').append(e.data);
            $('#his').append("\n");
        };

    });
</script>


咱们这里使用了websocket协议,打开页面即建立一个连接;

解释下php代码

onConnet就是连接时完成三次握手时,执行的触发动作;$connection是连接对象;

onMessage是当客户端通过连接发来数据时(Workerman收到数据时)触发的回调函数;$data是客户端连接上发来的数据,如果Worker指定了协议,则$data是对应协议decode(解码)了的数据;$connection是连接对象

onClose当客户端连接与Workerman断开时触发的回调函数。不管连接是如何断开的,只要断开就会触发onClose。每个连接只会触发一次onClose(注意:这里的断开指的是关闭浏览器,不是断网;断网的话需要做心跳检测来判断)

代码传送门

示例demo

标签: workerman

相关文章

Yii2.0 jQuery(...).yiiActiveForm is not a function

Yii2.0 jQuery(...).yiiActiveForm is not a function

记一个常见的错误,如下图当我们在view中创建一个activeForm的时候,有时会报这种错误;通常情况下,是jquery重复引入导致的,因为你引入的jquey的版本跟yii2自带jquery版本冲突...

Elasticsearch为什么搜索那么快?

Elasticsearch为什么搜索那么快?

介绍Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lu...

Yii2.0搭建接口模块教程

Yii2.0搭建接口模块教程

最近我需要做一个大项目中的一个模块,考虑用前后端分离,所以想自己搭建一套基于Yii2.0的restful接口出来,本来的时候老大想让我用spring boot,无奈我太菜只会php.....教程开始:...

谷歌浏览器加载前端资源status=canceled

谷歌浏览器加载前端资源status=canceled

如图,今天在做弹出框(modal中用了iframe)的时候,发现模态框弹出的时候,会有一些前端资源加载被取消,但是也会有加载时间,影响页面的加载速度;然后我尝试用火狐,发现没有这个问题经过一顿goog...

Elasticsearch第三篇之全文搜索及在Yii2.0中的使用

Elasticsearch第三篇之全文搜索及在Yii2.0中的使用

前几天做了一个模块,大数据的搜索,其实也不是特别大,组合起来差不多800万左右,用的是mysql数据库,需求有这么变态的两点;需要按照地址去搜索按照起止时间去搜索别的不说,就这两条,mysql也就只能...

Yii2.0整合ueditor并上传图片到七牛云

Yii2.0整合ueditor并上传图片到七牛云

某个项目要做一个文章模块,用到Ueditor,并且ue中的图片要上传到七牛,所以总结下步骤;1、Yii2.0下载ueditor for Yii2.0和七牛composer require&n...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。