Workerman的一些应用方向如下
- 即时通讯类 例如网页即时聊天、即时消息推送、微信小程序、手机app消息推送、PC软件消息推送等等
- 物联网类 例如Workerman与打印机通讯、与单片机通讯、智能手环、智能家居、共享单车等等。
- 游戏服务器类
- SOA服务化 利用Workerman将现有业务不同功能单元封装起来,以服务的形式对外提供统一的接口,达到系统松耦合、易维护、高可用、易伸缩。[示例 workerman-json-rpc、 workerman-thrift]
- 其它服务器软件 例如 GatewayWorker,PHPSocket.IO,http代理,sock5代理,分布式通讯组件,分布式变量共享组件,消息队列、DNS服务器、WebServer、CDN服务器、FTP服务器等等
- 中间件 例如异步MySQL组件,异步redis组件,异步http组件,异步消息队列组件,异步dns组件,文件监控组件,还有很多第三方开发的组件框架等等 原理: worker是workweman中的基本容器,每个worker都可以开启多个进程监听端口并使用特定的协议通讯,类似nginx监听端口;每个Worker进程独立运作,采用Epoll(需要装event扩展)+非阻塞IO,每个Worker进程都能做上万的客户端连接,并处理这些连接上发来的数据。主进程为了保持稳定性,只负责监控子进程,不负责接收数据也不做任何业务逻辑。
现在我们就可以做一个聊天室,关键代码如下:
<?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"> <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是对应协议decode(解码)了的数据;$connection是连接对象
onClose当客户端连接与Workerman断开时触发的回调函数。不管连接是如何断开的,只要断开就会触发onClose。每个连接只会触发一次onClose(注意:这里的断开指的是关闭浏览器,不是断网;断网的话需要做心跳检测来判断)
代码传送门(github.com/BoHongtao/W…)
示例demo(github.com/BoHongtao/W…)