PHP的异步、并行、高性能网络通信引擎swoole的安装及websocket服务的使用

来源:互联网 发布:流体力学分析软件 编辑:程序博客网 时间:2024/06/08 06:15

点击进入本部分的视频教程


说明: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我会在后边的文章中再来说明。对于这部分内容的更多解释请看视频教程。
有任何问题请给我留言

原创粉丝点击