laravel workerman

laravel + (workerman gateway-worker) 目录结构  必须按照次目录结构├── Applications // 这里是所有开发者应用项目 │   └── YourApp // 其中一个项目目录,目录名可以自定义 │   ├── Events.php // 开发者只需要关注这个文件 │   ├── start_gateway.php // gateway进程启动脚本,包括端口号等设置 │   ├── start_b... 阅读详情
由于项目需要,要在laravel上面使用workerman,在网上查了好多资料,总结下,做下笔记,以便以后需要

一、安装 workerman

在项目根目录执行

composer require workerman/workerman
二、创建自定义 artisan 命令来启动 workerman 服务

由于 laravel 不能直接在根目录下执行 php 命令,所以需要创建 artisan  命令用于后面 workerman 服务的开启。

1,生成 WorkermanCommand 文件

php artisan make:command WorkermanCommand

执行以上命令行会在 app/Console/Commands/ 目录下生成 WorkermanCommand.php 文件。

<?php
    namespace App\Console\Commands;
    use Workerman\Worker;
    use Illuminate\Console\Command;
    class WorkermanCommand extends Command {
        private $server;
        // -d 是否以debug方式运行
        protected $signature = 'workerman {action} {-d?}';
        protected $description = 'Start a Workerman server.';
        public function __construct() {
            parent::__construct();
        }

        /** * Execute the console command. * * @return mixed */
        public function handle() {
            global $argv;
            $arg = $this->argument('action');
            $argv[1] = $argv[2];
            $argv[2] = isset($argv[3]) ? "-{$argv[3]}" : '';

            switch ($arg) {
                case 'start':
                    $this->start();
                    break;
                case 'stop':
                    $this->stop();
                    break;
                case 'restart':
                    $this->restart();
                    break;
                case 'reload':
                    $this->reload();
                    break;
            }
        }
        private function start() {
            // 创建一个Worker监听20002端口,不使用任何应用层协议
            $this->server = new Worker("tcp://0.0.0.0:8383");
            // 启动4个进程对外提供服务
            $this->server->count = 4;
            $handler = \App::make('handlers\WorkermanHandler');
             // 连接时回调
            $this->server->onConnect = [$handler, 'onConnect'];
             // 收到客户端信息时回调
            $this->server->onMessage = [$handler, 'onMessage'];
             // 进程启动后的回调
            $this->server->onWorkerStart = [$handler, 'onWorkerStart'];
             // 断开时触发的回调
            $this->server->onClose = [$handler, 'onClose'];
             // 运行worker
            Worker::runAll();
        }

        private function stop() {
            $worker = new Worker('tcp://0.0.0.0:8383');
            // 设置此实例收到reload信号后是否reload重启
            $worker->reloadable = false;
            $worker->onWorkerStop = function($worker)
            {
                echo "Worker reload...\n";
            };
            // 运行worker
            Worker::runAll();
        }
        private function restart() {
            $worker = new Worker('tcp://0.0.0.0:8383');
            // 设置此实例收到reload信号后是否reload重启
            $worker->reloadable = true;
            $worker->onWorkerStart = function($worker)
            {
                echo "Worker restart...\n";
            };
            // 运行worker
            Worker::runAll();
        }
        private function reload() {
            $worker = new Worker('tcp://0.0.0.0:8383');
            // 设置此实例收到reload信号后是否reload重启
            $worker->reloadable = false;
            $worker->onWorkerStart = function($worker)
            {
                echo "Worker reload...\n";
            };
            // 运行worker
            Worker::runAll();
        }
    }

这里使用了 PHP 类方法的回调。(PHP几种回调写法)
这里我们创建了一个自定义命令 workerman [action]   [-d] ,通过此命令即可开启 workerman 服务。
在这个自定义命令还引用了其他的类文件,如:

$handler = \App::make('handlers\WorkermanHandler');

所以,需要创建一个 WorkermanHandler.php 的文件来处理对应的操作。


还需要在app/Console/Commands/Kernel.php 中增加

protected $commands = [
    //
    \App\Console\Commands\WorkermanCommand::class

];

2,创建 WorkermanHandler.php
创建文件 app/handlers/WorkermanHandler.php

<?php
    namespace handlers;
    use Workerman\Lib\Timer;

    // 心跳间隔10秒
    define('HEARTBEAT_TIME',50);

    class WorkermanHandler {
        // 处理客户端连接
        public function onConnect($connection) {
            echo "链接成功";
        }

        // 处理客户端消息
        public function onMessage($connection, $data) {
               //当上来数据获取最后上传数据的时间
             $connection->lastMessageTime = time();

            // 向客户端发送hello $data
           $connection->send('Hello, your send message is: ' . $data);
        }

        // 处理客户端断开
        public function onClose($connection) {
            echo "connection closed from ip {$connection->getRemoteIp()}\n";
        }

        public function onWorkerStart($worker) {
            Timer::add(1, function () use ($worker) {
                $time_now = time();
                foreach ($worker->connections as $connection) {
                    // 有可能该connection还没收到过消息,则lastMessageTime设置为当前时间
                    if (empty($connection->lastMessageTime)) {
                        $connection->lastMessageTime = $time_now;
                        continue;
                    }
                    // 上次通讯时间间隔大于心跳间隔,则认为客户端已经下线,关闭连接
                    if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) {
                        echo "Client ip {$connection->getRemoteIp()} timeout!!!\n"; $connection->close();
                    }
                }
            });
        }
    }

3,修改 composer.json 文件,让 app/handles 文件夹下的类文件自动加载。

"autoload": {
    "classmap": [
        ...
        "app/handles"
    ],
    ...
},

至此。workman的命令定义已经完成。

使用:
php artisan workerman start d

如果看到以下内容,说明 workerman 服务启动正常:

Workerman[artisan] start in DEBUG mode
----------------------- WORKERMAN -----------------------------
Workerman version:3.5.4          PHP version:7.1.4
------------------------ WORKERS -------------------------------
user          worker        listen                   processes status
root          none          tcp://0.0.0.0:8383   1         [OK] 
----------------------------------------------------------------
Start success.
laravel workerman多进程定时任务 记录 一、安装workerman composer require workerman/workerman 二、编写artisan控制台命令 php artisan make:command WorkermanTimerCommand 在 laravel 的 app\Console\Commands 目录下生产了一个 WorkermanTimerCommand.php 文件 三、编写workerman控制台命令 <?php namespace App\Console\Commands; 阅读详情

相关推荐

STM32 FDCAN热插拔恢复机制与自动重发功能优化

本文深入分析了STM32 FDCAN在热插拔场景下触发bus-off状态导致通讯中断的根本原因,指出自动重发功能是问题关键。通过禁用自动重发、配置硬件自动恢复机制及优化总线参数,实现了FDCAN热插拔后的100%稳定恢复,为工业应用提供了可靠的CAN总线解决方案。

ice55的博客 685

laravel与workerman结合

laravel 下使用workerman 简单总结

believer_li的博客 2237

Java8动态生成SFunction:基于字段名的Lambda表达式实践

本文深入探讨了在Java8中如何基于字段名动态生成SFunction,以解决MyBatis Plus的LambdaQueryWrapper在动态查询场景下的局限性。通过核心原理LambdaMetafactory的解析和手把手的代码实现,展示了如何将字符串字段名转换为类型安全的Lambda表达式,从而实现真正动态、类型安全的查询条件构建与通用数据处理,显著提升代码的灵活性与安全性。

sss66的博客 953

Laravel+workman+redis实现多进程异步任务处理

Laravel+workman+redis实现多线程异步任务处理

小坚的技术博客 1583

UR10e+D435+ag95夹爪 gazebo 仿真记录(一)

学习仿真环境gazebo下利用UR10e机械臂搭建模拟平台,此博客用于记录搭建过程!!主要参考光头明明、总有一天全城的人都要高看我们和bug404_三位博主。最终自己功能包的主要参考了bug404_的ur_platform,感觉这个结构比较合理。运行环境:Ubuntu18.04+Ros-melodic+Gazebo9。

Forbiven的博客 6328

OriginPro实战:5步搞定碳材料拉曼光谱D峰G峰分析(附完整数据处理流程)

本文详细介绍了使用OriginPro进行碳材料拉曼光谱D峰G峰分析的完整流程,涵盖数据预处理、多图层可视化、高精度分峰拟合等关键步骤。特别针对材料科学研究中的基线漂移、多峰重叠等问题提供专业解决方案,帮助研究者快速完成从原始数据到科研级图表的全流程分析,提升碳材料表征效率与准确性。

vodka的博客 942

laravel集成Workerman搭建websocket服务,前端调用,服务器启动

laravel集成Workerman搭建websocket服务,前端调用,服务器启动

wwsseeddrrff的博客 2019

用LangFuse+LangChain打造可观测的AI应用:从埋点到成本监控实战

本文详细介绍了如何将开源可观测性平台LangFuse深度集成到基于LangChain构建的AI应用中,特别是电商客服机器人场景。通过从基础SDK集成、提示词管理到成本监控的完整实战,帮助开发者实现对LLM应用内部工作流的清晰追踪、问题排查与费用分析,从而打造稳定、可控的生产级AI应用。

dapp9builder的博客 711

Laravel接入workerman

laravel 快速接入websocket 即时通讯开发必备利器。

五月网络科技 1987

别光看文档了!手把手带你用Habitat-Lab跑通第一个PointNav任务(附完整代码与避坑指南)

本文详细介绍了如何使用Habitat-Lab快速跑通第一个PointNav任务,包括环境配置、依赖安装、数据集下载与路径配置等关键步骤,并提供了完整的代码实现与常见问题排查指南。特别适合刚接触Habitat-Lab的开发者,帮助避开官方Quickstart未提及的坑,快速上手具身AI任务。

weixin_42662293的博客 271

8.9华为OD机试真题 新系统 - 查找最佳充电策略 (Java/Py/C/C++/Js/Go)

8.9华为OD机试真题 新系统 - 查找最佳充电策略 (Java/Py/C/C++/Js/Go)

算法大师! 1166

laravel 使用workerman加速应用

背景 公司项目使用的是laravel框架,开发完后压测一直不过,期间开启过opcache扩展加速(不属于本篇内容,不在此赘述),后决定采用workerman或swoole加速laravel应用,本篇以workerman为例。 首先大家应该知道laravel每次收到请求都会把框架核心代码加载一遍,使用workerman提升性能的关键是把框架核心代码缓存起来,这样就不需要每次重新加载了,以此来提升性...

一个半程序猿 5367

CDR插件开发之CPG插件004 - 认识VGCore并编译生成你的第一个CPG文件

上篇文章中,讲到了使用VS2019编译CDR类型库 VGCoreAuto.tlb,编译后得到了vgcoreauto.tlh和vgcoreauto.tli两个文件。本文将对这两个文件说明,并演示通过标准的libid形式来导入CDR类型库,在这个过程中,穿插一些VS2019的使用技巧(删除目录、复制工程、打开项目或解决方案、修改解决方案名称、修改项目名称等),使读者循序渐进,逐步提高对VS2019工具的熟练程度,最后通过修改项目属性配置,生成第一个CPG文件。

Zebe 2984

laravel+workerman的demo

https://github.com/lingdulvlv/laravel_workerman 安装laravel: composer create-project laravel/laravel=5.4.* --prefer-dist 安装workerman相关扩展: "workerman/gateway-worker": "^3.0", "workerman/gatewayclie...

qq_38257857的博客 2258

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

laravel集成workerman实现websocket长链接

1. 安装workerman composer require workerman/workerman -vvv 注: -vvv是查看composer加载详情的意思 2.创建laravel自定义命令 php artisan make:command Workerman 注:执行这段命令后会在\app\Console\Commands文件夹下生成Workerman.php文件 3.命令文件代码Workerman.php: <?php namespace App\Conso...

m0_37619318的博客 2146

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

laravel框架中引入Workerman

1.安装Workerman   首先在laravel根目录下安装Workerman   命令:$ composer require workerman/gateway-worker 2.创建 Workerman 启动文件   创建一个 artisan 命令行工具来启动 Socket 服务端,在 app/Console/Commands 目录下建立命令行文件。   <?php na...

weixin_30563319的博客 711

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

laravel artisan 后台运行_在 Laravel 中使用 Workerman 进行 socket 通讯

1. 安装 Workerman由于要使用客户端点对点通讯,选择了 workerman/gateway-worker 的扩展包,它已经引入了 workerman/workerman 。$ composer require workerman/gateway-worker我的官方群说话算话,700粉丝福利安排PHP进阶架构资料,工作中准备的,免费获取程序猿的生活:【社群福利】30G-PHP进阶资料,助...

weixin_42353258的博客 1460

laravel8集成workerman

优点是 workerman与laravel共享代码, 能够使用laravel强大的功能写workerman 缺点: 速度可能不理想 ------------- 首先执行composerrequireworkerman/workerman 安装workerman 创建command php artisan make:commandWorkermanHttpserver 生成文件: app/Console/Commands/WorkermanHttpserver.php ...

草根上的须子 1039

php larval workerman,laravel框架与workerman的整合

一、配置首先运行命令检测当前cli环境是否支持:curl -Ss http://www.workerman.net/check.php | phpphp -m //查看当前cli环境php模块某些集成环境cli的配置文件和浏览器的配置文件路径不同,如mamppro.cli下运行php --ini查看,本实例所在环境是MacOS系统,PHP7的环境下进行的(Linux与此类似,Windows下有些不...

weixin_33321522的博客 503

laravel+workerman/gateway-worker 从安装到运行

使用composer安装, 所以先要确保安装了composer工具 1. 为了安装快, 安装一个composer扩展hirak/prestissimo, 可以多线程下载 composer global require hirak/prestissimo 2. 设置镜像地址为阿里云(使用官方镜像会有被墙资源, 安装很可能失败) composer config -g repo.packagist c...

phpxxo的博客 3136

php socket laravel,在 Laravel 中使用 Workerman 进行 socket 通讯 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社...

[在 Laravel 中使用 Workerman 进行 socket 通讯 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区]1.安装 Workerman由于要使用客户端点对点通讯,选择了 workerman/gateway-worker 的扩展包,它已经引入了 workerman/workerman 。$ composer require workerm...

weixin_29416459的博客 1456

Laravel配合Workerman命令行监听MQTT

公司是做物联网的,经常有服务端通过PHP与物联网设备通过MQTT协议通信,恰好PHP框架用的是Laravel,刚接触的时候发现没什么比较接近的资料,自己摸索了一阵,已经在几个项目使用上了,这里将相关的步骤贴出来,方便以后自己查阅以及有类似需求的朋友参考。众所周知,PHP是一门专为Web设计的语言,绝大部分时间都是与Web Server通信,再后端一点,也是与别的后端语言配合做“前端”,其底层设计也限制了其本身更适合做Web那些事,所以如果想要用来服务端监听MQTT,就需要别的库来配合,这里说的库主要就两个,

larance的挨踢生活 1343

php larval workerman,laravel-workerman简易聊天室

ENVphp-7.2 | Laravel-5.5 | workerman-3.5安装workerman在安装好laravel的目录中执行命令composer require workerman/workermanlaravel创建命令控制器php artisan make:command Workermanlaravel与workerman整合上面命令会创建文件app\Console\Comman...

weixin_42524762的博客 285

laravel框架整合workerman

配置 首先运行命令检测当前cli环境是否支持: curl -Ss http://www.workerman.net/check.php | php php -m //查看当前cli环境php模块 某些集成环境cli的配置文件和浏览器的配置文件路径不同,如mamppro.cli下运行php --ini查看 composer安装workerman cd your_path/lara

wangjinbao5566的博客 6255
上一篇: Composer 安装与使用
下一篇: nginx 配置文件
YuYan_wang
博客等级 码龄10年 66粉丝 29原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值