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


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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MarsWill

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值