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:在需要使用的时候,引入是这样的:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/156248.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Task单机定时任务(使用及阻塞问题解决)

一、介绍 SpringTask是Spring自主研发的定时任务工具&#xff0c;并且存在于Spring体系中&#xff0c;不需要添加任何依赖 Spring Boot 默认在无任何第三方依赖的情况下使用 spring-context 模块下提供的定时任务工具 Spring Task。 我们只需要使用 EnableScheduling 注解就可…

Unity - Cinemachine

动态获取Cinemachine的内部组件 vCam.GetCinemachineComponent<T>() 动态修改Cinemachine的Transposer属性 var vCamComp transfrom.GetComponent<CinemachineVirtualCamera>(); var transposerComp vCamComp.GetCinemachineComponent<CinemachineTransposer&…

【Linux】gcc/g++ gdb 使用

目录 1&#xff0c;背景知识 2&#xff0c;gcc 如何完成 1&#xff0c;预处理(进行宏替换) 2&#xff0c;编译&#xff08;生成汇编&#xff09; 3&#xff0c;汇编&#xff08;生成机器可识别代码&#xff09; 4&#xff0c;连接&#xff08;生成可执行文件或库文件&…

SpringCloud微服务:Nacos快速入门

目录 第一步&#xff1a;cloud-demo的pom文件 第二步&#xff1a;user-service的pom文件 第三步&#xff1a; user-service的yml文件 第四步&#xff1a;order-service的pom文件 第五步&#xff1a; order-service的yml文件 运行 访问数据 1.Nacos服务搭建 下载安装包 …

IDEA创建SpringBoot的多模块项目教程

最近在写一个多模块的SpringBoot项目&#xff0c;基于过程总了一些总结&#xff0c;故把SpringBoot多个模块的项目创建记录下来。 首先&#xff0c;先建立一个父工程&#xff1a; &#xff08;1&#xff09;在IDEA工具栏选择File->New->Project &#xff08;2&#xff0…

【AI视野·今日NLP 自然语言处理论文速览 第六十二期】Wed, 25 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 25 Oct 2023 (showing first 100 of 112 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MuSR: Testing the Limits of Chain-of-thought with Multistep Soft R…

电脑监控软件:保护企业核心信息资产,防止数据泄露

电脑监控软件&#xff1a;保护企业核心信息资产&#xff0c;防止数据泄露 随着信息技术的飞速发展&#xff0c;电脑已经成为了企业中必不可少的办公工具。然而&#xff0c;与此同时&#xff0c;企业的核心信息资产也面临着越来越大的安全风险。 下载使用安企神电脑屏幕监控软…

LVGL案例分享--手把手教你移植到T113-i国产工业开发板

市面上有许多嵌入式GUI库可供选择&#xff0c;包括开源GUI库和闭源GUI库&#xff0c;开源GUI库&#xff1a;LVGL&#xff0c;EmWin等&#xff1b;闭源GUI库&#xff1a;TouchGFX&#xff0c;柿饼GUI等。 本篇文章主要描述如何将LVGL8.1移植到创龙科技的T113-i的开发板上。 LV…

vue3+vant 实现树状多选组件

vue3vant 实现树状多选组件 需求描述效果图代码父组件引用selectTree组件 tree组件数据格式 需求描述 移动端需要复刻Pc端如上图的功能组件&#xff0c;但vant无组件可用&#xff0c;所以自己封装一个。 效果图 代码 父组件引用 import TreeSelect from "/selectTree.vu…

小型内衣洗衣机什么牌子好?性价比高的迷你洗衣机推荐

现在洗内衣内裤也是一件较麻烦的事情了&#xff0c;在清洗过程中还要用热水杀菌&#xff0c;还要确保洗衣液是否有冲洗干净&#xff0c;还要防止细菌的滋生等等&#xff0c;所以入手一款小型的烘洗全套的内衣洗衣机是非常有必要的&#xff0c;专门的内衣洗衣机可以最大程度减少…

移交计划书、移交确认单

项目移交过程文件&#xff1a; 1、移交计划书 2、移交确认单 1、移交计划 2、移交确认单

2023年03月 Scratch(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 下列说法不正确的是?( ) A:可以从声音库中随机导入声音 B:可以录制自己的声音上传 C:可以修改声音的大小 D:不能修改声音的速度 答案:D 针对声音可以进行导入,上传,修改声音大小和速度这些操作,故正确答案选择D。…

牛只识别 牛脸识别 个体识别 身份识别

融合YOLOv5s与通道剪枝算法的奶牛轻量化个体识别方法 Light-weight recognition network for dairy cows based on the fusion of YOLOv5s and channel pruning algorithm 论文链接 知网链接 点击进入正文 该文章讨论了奶牛花斑、光照条件、不同剪枝方法、不同剪枝率对准确率的…

Power Automate-当收到HTTP请求时触发流程

选择创建自动化云端流&#xff0c;点跳过 第一个操作搜索HTTP&#xff0c;点击当收到HTTP请求时 第一个下拉框选择Anyone&#xff0c;给任何人提供访问权限&#xff0c;当然也可以根据需求选择 点击使用示例有效负载生成架构 写入JSON&#xff0c;点击完成 正文JSON架构就自动生…

Tosca 2023x 新功能介绍

Tosca/Structure的功能增强 热优化功能增强 在优化过程中&#xff0c;支持将对流边界条件转移至新创建的表面&#xff0c;方便更加真实地模拟传热行为。支持恒定传导。多物理场优化能力增强。通过使用多个输入面板对热和结构荷载进行分别输入&#xff0c;以支持同时对热和结构…

校园跑腿小程序源码系统+多校园版+取快递+食堂超市跑腿+外卖 带完整的搭建教程

大家好啊&#xff0c;又到了罗峰给大家分享源码的时间啦。今天要给大家分享的是一款校园跑腿小程序源码系统。这款系统功能十分强大&#xff0c;开发了多校园版。众所周知&#xff0c;校园跑腿的发展是从外卖配送一点点演变过来的&#xff0c;而校园跑腿的基础性服务项目就是帮…

【YOLOv7/YOLOv5系列算法改进NO.47】改进激活函数为GELU

文章目录 前言一、解决问题二、基本原理三、​添加方法四、总结 前言 作为当前先进的深度学习目标检测算法YOLOv7&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系…

modbus转profinet网关连接PLC与变频器控制摆辊应用在涂布机案例

通过兴达易控modbus转profinet网关的应用&#xff0c;PLC能够直接与变频器进行通讯&#xff0c;并实现对摆辊的精确控制。兴达易控modbus转profinet网关&#xff08;XD-MDPN100&#xff09;作为一个高性能的转换设备&#xff0c;能够稳定可靠地完成modbus和profinet之间的数据转…

智慧城市安全监控的新利器

在传统的城市管理中&#xff0c;井盖的监控一直是一个难题&#xff0c;而井盖异动传感器的出现为这一问题提供了有效的解决方案。它具有体积小、重量轻、安装方便等特点&#xff0c;可以灵活地应用于各种类型的井盖&#xff0c;实现对城市基础设施的全方位监控。 智能井盖监测终…

《低代码指南》——国内首个向量数据库标准亮相,腾讯云联合50家企业共同编制

11月15日,在腾讯云向量数据库技术及产业峰会上,腾讯云全面升级向量数据库多项核心性能,最高支持千亿级向量规模和500万QPS峰值能力,同时和信通院一起联合50多家企业共同发布了国内首个向量数据库标准,推进向量数据库及大模型相关产业走向大规模应用。 腾讯集团高级执行副总…