Workerman WebSocket示例

  • http://www.wangjian2333.com/article.php?article=42

    前段日子已经写过一篇关于websocket的文章,但是当时是用的nodejs来搭建websocket服务器,点击此处跳转到该博文。 但是咱毕竟是学PHP滴,所以掌握如何用PHP实现websocket功能是非常重要的。本文主要用到了一个高性能的PHP Socket服务器框架Workerman。Workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可 以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等(框架下载地址:Linux版Windows版)。

    1、框架的部署

    该框架完全由PHP编写而成,支持命名空间,支持类的自动加载,部署起来非常方便。我们首先创建一个空的PHP项目,然后将下载的Workerman框架解压到该项目即可。

    2、创建socket服务器

    wsserver.php代码如下:

    <?php
    use Workerman\Worker;
    require_once 'D:/website/socket/Workerman/Autoloader.php';
    
    //创建一个Worker监听127.0.0.1:8000, 使用websocket协议通讯
    $ws_worker = new Worker("websocket://127.0.0.1:8000");
    
    //启动4个进程对外提供服务
    $ws_worker->count = 4;
    
    //当接收到客户端发来的数据后显示数据并回发到客户端
    $ws_worker->onMessage = function($connection, $data) {
        //显示数据
        echo "you just received: $data\n";
        
        //向客户端回发数据
        $connection->send("you just send: $data");
    };
    
    //运行worker
    $ws_worker->runAll();

    注:该代码只能够在PHP_CLI模式下运行,打开cmd,运行php d:/website/socket/wsserver.php start即可开启服务器。

    3、客户端程序

    client.html代码如下:

    <!DOCTYPE html>
    <html>
    <head>
    <title>HTML5</title>
    <meta charset="utf-8" />
    <script src="./js/jquery.js"></script>
    <script>
    $(function() {    
        var socket;
        var readyState = ["connecting", "connected", "closing", "closed"];
        /* 打开连接事件 */
        $("button:eq(0)").click(function() {
            try {
                 /* 连接 */
                 socket = new WebSocket("ws://127.0.0.1:8000");
                 
                 /* 绑定事件 */
                 socket.onopen = function() {
                     $("#msg").html("连接成功...");
                 };
                 
                socket.onmessage = function(e) {
                     $("#msg").html($("#msg").html() + "<br />" + e.data);
                 };
                 
                 socket.onclose = function() {
                     $("#msg").html($("#msg").html() + "<br />关闭连接...");
                 };
            } catch(exception) {
                $("#msg").html($("#msg").html() + "<br />有错误发生");
            }
        });
        
        /* 发送数据事件 */
        $("button:eq(1)").click(function() {
            /* 检查文本框是否为空 */
            if($("#data").val() == "") {
                alert("请输入数据!");
                return;
            }
            
            try {
                socket.send($("#data").val());
                $("#msg").html($("#msg").html() + "<br />发送数据:" + $("#data").val());
            } catch (exception) {
                $("#msg").html($("#msg").html() + "<br />发送数据出错");
            }
            
            /* 清空文本框 */
            $("#data").val("");
        });
        
        /* 断开连接 */
        $("button:eq(2)").click(function() {
            socket.close();
        });
    });
    </script>
    </head>
    
    <body>
    <h1>WebSocket示例</h1>
    <input type="text" id="data" />
    <button>打开连接</button>
    <button>发送数据</button>
    <button>关闭连接</button>
    <p id="msg"></p>
    </body>
    </html>

    4、测试

    在浏览器中请求client.html,连接socket服务器,发送4次消息,查看客户端和服务端的运行情况。

    客户端运行结果:

    1.png

    服务端运行结果:

    2.png

    5、将客户端发送来的数据存入数据库

    只需简单的修改一下服务器代码即可,修改后的代码如下:

    <?php
    use Workerman\Worker;
    require_once 'D:/website/socket/Workerman/Autoloader.php';
    
    //创建一个Worker监听127.0.0.1:8000, 使用websocket协议通讯
    $ws_worker = new Worker("websocket://127.0.0.1:8000");
    
    //启动4个进程对外提供服务
    $ws_worker->count = 4;
    
    //初始化数据库连接
    $dsn = "mysql:host=localhost;dbname=chat;port=3306";
    $user = "root";
    $pwd = "yb0623";
    $pdo = new PDO($dsn, $user, $pwd);
    
    //当接收到客户端发来的数据后显示数据并回发到客户端
    $ws_worker->onMessage = function($connection, $data) {
        //显示数据
        echo "you just received: $data\n";
        
        //将数据插入到数据库
        global $pdo;
        $time = time();
        $insert = "insert into chat_message(content, time, from_id, to_id) values('$data', $time, 1, 2)";
        
        $pdo->exec($insert);
        
        //向客户端回发数据
        $connection->send("you just send: $data");
    };
    
    //运行worker
    $ws_worker->runAll();

    再次向服务器端发送一次消息并查看数据库:

    3.png

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值