前面讲过了workman,现在我们再了解另外一个swoole,首先我们要了解swoole是个啥?swoole其实是一个面向生产环境的 PHP 异步网络通信引擎,PHP + Swoole 作为网络通信框架可以使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。
特性:
1、 类似ORM的数据查询,提供SQL封装器,让MySQL的SQL与PHP的数组,会话,Cache无缝结合。
2、MVC分层结构,有效的程序结构分层,提高程序的可维护性和扩展性,实现低耦合,基于接口开发。
3、集成大量功能,比如方便的数据库操作,模板操作,缓存操作,系统配置,表单处理,分页,数据调用,字典操作,上传处理,内容编辑,调试等。
4、模板-数据反射系统,可以直接在模板中调用数据,提供很多标签,可以无需修改程序,只修改模板,即可实现网站各类更新维护工作。
如何运行swoole(简单的举个例子):
1.Windows版swoole下载地址:
https://link.zhihu.com/?target=https%3A//www.swoole.com/
2.配置全局变量:
Path:配置到项目下的bin目录地址
3.命令框查看是否配置成功:swoole-cli -v
4.PHP文件:(启动swoole服务)
<?php
//创建WebSocket Server对象,监听0.0.0.0:9502端口。
$ws = new Swoole\WebSocket\Server('0.0.0.0', 9502);
//监听WebSocket连接打开事件。
$ws->on('Open', function ($ws, $request) {
echo "Message: {$request->fd} is in!\n";
$ws->push($request->fd, "hello, welcome!xw\n");
});
//监听WebSocket消息事件。
$ws->on('Message', function ($ws, $frame) {
echo "Message: {$frame->data}\n";
$ws->push($frame->fd, "server: {$frame->data}");
});
//监听WebSocket连接关闭事件。
$ws->on('Close', function ($ws, $fd) {
echo "client-{$fd} is closed\n";
});
$ws->start();
5.HTML文件
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>swoole-cli demo</title>
</head>
<body>
<script>
var wsServer = 'ws://127.0.0.1:9502';
var websocket = new WebSocket(wsServer);
websocket.onopen = function (evt) {
console.log("Connected to WebSocket server.");
};
websocket.onclose = function (evt) {
console.log("Disconnected");
};
websocket.onmessage = function (evt) {
console.log('Retrieved data from server: ' + evt.data);
};
websocket.onerror = function (evt, e) {
console.log('Error occured: ' + evt.data);
};
</script>
</body>
</html>
6.开启服务:swoole-cli sw.php
7.浏览器访问html文件
到了这一步,环境就算搭建成功了
来个例子尝尝(广播: Redis 中订阅消息转发到 WebSocket 客户端):
//实例化
$server = new swoole_websocket_server("0.0.0.0", 9501);
//启动
$server->on('workerStart', function ($server, $workerId) {
$client = new swoole_redis;
$client->on('message', function (swoole_redis $client, $result) use ($server) {
if ($result[0] == 'message') {
foreach($server->connections as $fd) {
$server->push($fd, $result[1]);
}
}
});
$client->connect('127.0.0.1', 6379, function (swoole_redis $client, $result) {
$client->subscribe('msg_0');
});
});
$server->on('open', function ($server, $request) {
});
$server->on('message', function (swoole_websocket_server $server, $frame) {
$server->push($frame->fd, "hello");
});
$server->on('close', function ($serv, $fd) {
});
$server->start();