workman使用手册1.0

workman官网地址:高性能PHP应用容器 workerman

1:把workman项目放到linux服务器后,需要启动你的php文件,才可以使用

        定位到项目根目录:例:cd /mnt/workman

        启动代码:php outin.php start -d

        停止代码:php outin.php stop

        以debug(调试)方式启动: php outin.php start

2:workman服务端写法

<?php

use Workerman\Worker;
use Workerman\Timer;
use Workerman\MySQL\Connection;
use procedure\Attendance;

require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('websocket://0.0.0.0:8088');
Worker::$logFile = '/mnt/workman/log/outin.log';    //日志地址

$worker->uidConnetions = [];
$worker->onConnect = function($connection) use ($worker)
{
    $connection->onWebSocketConnect = function($connection , $httpBuffer) use ($worker)
    {
        // 可以在这里判断连接来源是否合法,不合法就关掉连接
        // $_SERVER['HTTP_ORIGIN']标识来自哪个站点的页面发起的websocket连接
//        if($_SERVER['HTTP_ORIGIN'] != 'https://www.workerman.net')
//        {
//            $connection->close();
//        }
        // onWebSocketConnect 里面$_GET $_SERVER是可用的
        // var_dump($_GET, $_SERVER);
        //前端传入的参数,可以根据type,company_uuid判断需要显示的链接有哪些
        $worker->uidConnetions[$connection->id]["connection"] = $connection;
        $worker->uidConnetions[$connection->id]["type"] = $_GET["type"];
        $worker->uidConnetions[$connection->id]["company_uuid"] = $_GET["company_uuid"];
    };
};

$worker->onClose = function ($connection) use ($worker)
{
    if (isset($connection->id)) {
        unset($worker->uidConnetions[$connection->id]);
    }
};


// 进程启动后定时推送数据给客户端
$worker->onWorkerStart = function($worker){
    //查表,有需要的,
   // file_put_contents("/mnt/workman/log/" .date("Ymd"). ".txt", date("Y-m-d H:i:s") . ":jin"  .PHP_EOL, FILE_APPEND);
    $db = new Connection('mysql地址','3306', 'root', 'password', '表名');    //mysql链接信息
    $attend = new Attendance();
    Timer::add(1, function()use($worker, $db, $attend){
        //10s之内的数据
        $time = time() - 10;
        $time = date("Y-m-d H:i:s",$time);
        //$time = date("Y-m-d 00:00:00",$time);
        $infos = $db->query("SELECT student_userid,class_name,student_name,sign_time,id,company_uuid,status,photo_url FROM sign WHERE tui = '1' AND is_delete = '0' AND sign_time > '$time' GROUP BY student_userid ORDER BY id desc");
        //获取信息
        $attend_data = $attend->getAttendanceData($db);
     
        foreach($worker->connections as $connection) {
            $res = $worker->uidConnetions[$connection->id];
            file_put_contents("/mnt/workman/log/" .date("Ymd"). ".txt", date("Y-m-d H:i:s") . "type1:".$res["type"]  .PHP_EOL, FILE_APPEND);
            //outin类型的,使用本回调
            if ($res["type"] == 'outin') {
                foreach ($infos as $v) {
                    $company_uuid = $v["company_uuid"];
                    $student_userid = $v["student_userid"];
                    $imgurl = $db->single("SELECT imgurl FROM stu_face WHERE company_uuid = '$company_uuid' AND student_userid = '$student_userid'");
                    if ($v["company_uuid"] == $res["company_uuid"]) {
                        $arr = [
                            "class_name"=>$v["class_name"],
                            "student_name"=>$v["student_name"],
                            "status"=>$v["status"],
                            "photo_url"=>$imgurl,
                            "sign_time"=>$v["sign_time"]
                        ];
                        //打印输出查询的数据
                        file_put_contents("/mnt/workman/log/" .date("Ymd"). ".txt", date("Y-m-d H:i:s") . "xinxi:".json_encode($arr, true)  .PHP_EOL, FILE_APPEND);
                        //根据数据为已推送
                        $db->query("UPDATE sign SET tui = '2' WHERE tui = '1' AND company_uuid = '$company_uuid' AND student_userid = '$student_userid'");
                        $connection->send(json_encode($arr));
                    }
                }
            }
           
            if ($res["type"] == 'banji') {
                $attend->banji($res, $attend_data["ban_infos"],$db,$connection);
            }
        }
    });
};
Worker::runAll();

2:自动加载问题,参考:自动加载-workerman手册

        注:1:文件名是小写的,在使用命名空间的时候,也是使用小写

2:在需要使用的时候,引入是这样的:

Workerman中,可以通过使用异步任务来处理长连接中的业务逻辑,避免阻塞主进程。异步任务可以在Worker进程中通过`AsyncTask`类来实现,具体的步骤如下: 1. 在Worker进程中创建`AsyncTask`对象,指定异步任务的处理方法。 ```php use \Workerman\Worker; use \Workerman\MySQL\Connection; use \Workerman\AsyncTask; $worker = new Worker('tcp://0.0.0.0:8000'); $worker->onWorkerStart = function($worker) { // 创建MySQL连接 $mysql = new Connection('127.0.0.1', '3306', 'username', 'password', 'dbname'); // 创建异步任务 $task = new AsyncTask(); // 设置异步任务的处理方法 $task->onMessage = function($task, $data) use ($mysql) { // 处理业务逻辑 $result = $mysql->query('SELECT * FROM users WHERE id='.$data); // 返回处理结果 $task->send($result); }; // 将异步任务注册到Worker进程中 $worker->addTask($task); }; ``` 2. 在客户端连接上来后,将需要处理的数据发送到异步任务中,等待异步任务处理完成后,再将结果返回给客户端。 ```php $worker->onConnect = function($connection) use ($worker) { // 接收客户端发送的数据 $connection->onMessage = function($connection, $data) use ($worker) { // 将数据发送到异步任务中处理 $worker->task($data, function($result) use ($connection) { // 处理异步任务返回的结果 $connection->send(json_encode($result)); }); }; }; ``` 通过以上的步骤,我们就可以在长连接中使用异步任务来处理业务逻辑了。需要注意的是,异步任务的处理方法会在Worker进程中的异步任务进程中执行,所以需要将需要的资源例如MySQL连接等在onWorkerStart回调函数中创建。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值