说明:swoole是PHP的异步、并行、高性能网络通信引擎,是一个和开发框架无关的PHP扩展,其本身是使用c开发的。其异步能力在一些地方能够和nodejs媲美。在PHP中异步和多线程一直是搭不上边的话题,但是swoole在底层做了非常优秀的实现。所以,如果你还在做简单的PHP开发那么这个是进阶的基础。当然为了工程化的解决方案在我的视频中结合了thinkPHP5来使用,当然thinkPHP5所做的工作使用其他框架也能实现。
在PHP中安装最新的swoole扩展
在PHP中安装swoole扩展的方法有两种,一种是源码安装,另外一种是使用pecl来安装。当然使用pecl来安装更为方便,如果还没有使用过pecl或者在你系统的命令行中输入pecl提示命令找不到那么请看我的另一篇文章http://blog.csdn.net/marswill/article/details/77188521使用pecl安装swoole的方式如下:
marswilldeMacBook-Pro:bin weiyongqiang$ pecl swoole
如何安装最新版
其实使用pecl安装的swoole是目前最新正式版的,版本为swoole1.9.19但是最新版本是swoole2.0.8是beta版
先使用pecl搜索swoole的扩展包版本:
pecl search swoole
在搜索的版本中可以看到swoole2.0.9的beta版本。安装时带上版本即可
pecl install swoole-2.0.9
在安装之后还有一部就是在php.ini中添加extension扩展。
extension=swoole.so //mac或者Linux系统
extension=swoole.dll //Windows系统
最后请重启下php-fpm在Linux系统下是
service php-fpm restart
这样就会安装最新的版本,紧接着就是查看swoole扩展安装是否成功。在命令行执行:
php -m
如果在列表中有swoole就说明安装成功了。或者使用phpinfo()函数查看有没有swoole
写一个websocket服务
就这么简单,这样就构建了一个websocket服务。监听了本机的9501端口。下边我来解释下:
<?php
/**
* Created by PhpStorm.
* Author: 魏永强 <hayixia606@163.com>
* GitHub: https://github.com/gmars
* Blog: http://blog.csdn.net/marswill
* Date: 2017/9/14
* Time: 下午3:57
*/
//实例化一个swoole的websocket服务监听本机的9501端口
$server = new swoole_websocket_server("0.0.0.0", 9501);
//websocket的open事件。当open事件被触发时执行后边的function事件处理器,在事件处理器中有两个参数,一个为server另一个为客户端发送来的request。这儿和平常的http请求非常相似,注意了是相似而已。在请求对象中其实包含了客户端的id和其他信息在分析时可以打印出来分析。
$server->on("open", function (swoole_websocket_server $server, $request) {
echo "server: handshake success with fd{$request->fd}\n";
});
//这个是websocket的message事件。监听客户端发送来的消息事件
$server->on("message", function (swoole_websocket_server $server, $frame) {
echo "revice from {$frame->fd}:{$frame->data},opcode:{$frame->opcode}";
$dataArr = explode('@', $frame->data);
$server->push($dataArr[1], $dataArr[0]);
});
//这个是websocket的客户端close事件
$server->on("close", function ($ser, $fd) {
echo "client {$fd} closed\n";
});
//定义完server要处理的事件以及处理器后需要【启动server】
$server->start();
可能有人会有疑问,这个PHP文件应该放在哪儿?感觉在自己的框架中没地方放置呀。既不是控制器也不是函数。
其实这个文件可以放置在任何地方,在运行websocket服务时是使用PHP命令行来运行的。
php websocket.php //websocket是我对以上部分的文件命令
运行后命令行会处於挂起状态,这个不用去理会,当然最好的解决办法是写一个脚本来运行这部分PHP再监听服务是否关闭,关闭后重新挂起。
写一个websocket客户端
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Title</title>
<style type="text/css">
#show{
width: 600px;
height: 300px;
overflow-y: scroll;
}
.my-message{
background-color: rgba(105, 105, 105, 0.64);
color: #9e0505;
width: 200px;
float: right;
padding: 10px;
}
.other-message{
background-color: rgba(105, 105, 105, 0.64);
color: #9e0505;
width: 200px;
float: left;
padding: 10px;
}
</style>
</head>
<body>
<div id="show">
</div>
<div class="panel">
内容:<textarea id="content"></textarea>
收信人:<input type="text" id="touser">
<input type="button" id="send-btn" value="发送">
<input type="button" id="close-btn" value="关闭">
</div>
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
var socket = new WebSocket("ws://127.0.0.1:9501");
$("#close-btn").click(function () {
socket.close();
})
$("#send-btn").click(function () {
var touser = $("#touser").val();
var content = $("#content").val();
var htmlstr = "<div><p class='my-message'>我:"+content+"</p></div>";
$("#show").append(htmlstr);
socket.send(content+"@"+touser);
})
socket.onmessage = function (p1) {
var htmlstr = "<div><p class='other-message'>"+p1.data+"</p></div>";
$("#show").append(htmlstr);
}
</script>
</body>
</html>
这个是利用了HTML5的api来实现的一个简单的聊天室功能。当然使用nginx来代理websocket以及安全的wss协议的websocket我会在后边的文章中再来说明。对于这部分内容的更多解释请看视频教程。
有任何问题请给我留言