美文网首页
php使用wokerman实现实时订单提醒

php使用wokerman实现实时订单提醒

作者: 风度翩翩的程序猿 | 来源:发表于2021-08-31 14:19 被阅读0次

首先我们先下载wokerman [ https://www.workerman.net/download ]
下载下来引入自己的server.php

代码如下

<?php
use Workerman\Worker;

require_once __DIR__ . '/Workerman/Autoloader.php';
// 注意:这里与上个例子不同,使用的是websocket协议
$ws_worker = new Worker("websocket://211.149.141.92:666");
$ws_worker->onConnect = function ($conn) { // 当有用户连接时我要做的事情 $conn 保存当前连接的用户
//    echo 'hello';
    \Workerman\Lib\Timer::add(60, function () use ($conn) {
        $conn->send('ping'); // 发送消息,接收一个字符串,该字符串就会发送到客户端
    }); // 秒,要执行的逻辑

};
// // 启动4个进程对外提供服务
$ws_worker->count = 1;
$ws_worker->connection_uids=array(); //保存每个用户的connection
// 当收到客户端发来的数据后返回 $data给客户端
$ws_worker->onMessage = function ($conn, $data) {
    // 数组 $conn->worker->connections // 保存了所有的客户端连接
    // 遍历每个连接
    // foreach ($conn->worker->connections as $key=>$val){
    //     if($val != $conn){ // 除了自己 发给其他人
    //         $val->send($data);
    //     }
    // }
    // 0类型  1发给谁uid  2消息  3to 发给谁uid
    global $ws_worker;
    $d = explode(':',$data);
    switch($d[0]){
        case 'login':
            $conn->uid=$d[1];
            $ws_worker->connection_uids[$d[1]]=$conn;
            echo "收到登录请求,uid=".$d[1]."\n";
            break;
        case 'send_message':
            if($d[3]=='all'){
                // echo "向全部用户发送消息\n";
                broadcast('全部用户');
            }else{
              // 给指定的人发送消息
                // echo "向用户".$d[3]."发送消息\n";
                sendMessageByUid($d[3],$d[2]);
            }
            break;
        default:
            break;
    }
};

$ws_worker->onError = function ($conn) { // 出错了怎么办
    
};
$ws_worker->onClose = function ($conn) { //  关闭连接怎么办
    global $ws_worker;
    echo "用户{$conn->uid}退出\n";
    if(isset($conn->uid)){
        unset($ws_worker->connection_uids[$conn->uid]);
    }
};

//向所有用户发送消息
function broadcast($message){
    global $ws_worker;
    foreach($ws_worker->connections as $conn){
        $conn->send($message);
    }
}
 
//向某个用户发送消息
function sendMessageByUid($uid,$message){
    global $ws_worker;
    if(isset($ws_worker->connection_uids[$uid])){
        $conn=$ws_worker->connection_uids[$uid];
        $conn->send($message);
    }
}

// 运行worker
$ws_worker->runAll();

客户端

<html>
<body>
<div id="b">

</div>
<input type="text" id="a"/>
<button onclick="send();">发送</button>
</body>
<script>
    // socket客户端
    var ws = new WebSocket('ws://211.149.141.92:2000');
    ws.onopen = function (event) {
       
    };
    ws.onmessage=function (event) {
        // var d = JSON.parse(event.data);
        // if(d.type == 'msg'){
        //     alert(d.content)
        // }
        console.log(event)
    };
    ws.onerror=function (event) {

    };
    ws.onclose=function (event) {

    };
    function send() {
        var btn  = document.getElementById('a');
        ws.send(btn.value); // 发送到服务器
    }
</script>
</html>

***需要注意的workerman的适应的环境,window不需要任何扩展依赖,Linux就不同了,详细的请看文档[http://doc3.workerman.net/315115] 还有就是开启服务必须是命令行 ***

以debug(调试)方式启动

`php start.php start`

以daemon(守护进程)方式启动

`php start.php start -d`

### 停止

`php start.php stop`

### 重启

`php start.php restart`

### 平滑重启

`php start.php reload`

### 查看状态

`php start.php status`

相关文章

网友评论

      本文标题:php使用wokerman实现实时订单提醒

      本文链接:https://www.haomeiwen.com/subject/jljziltx.html