首页 > 其他分享 >workerman 服务

workerman 服务

时间:2024-04-07 17:45:36浏览次数:17  
标签:服务 gateway client workerman http php id

# 通过 composer 安装 workerman
"workerman/workerman": "^4.1",
"workerman/gatewayclient": "^3.0",
"workerman/gateway-worker": "^3.1",

# api 新建文件 workerman  放 Events.php ,start_businessworker.php ,start_gateway.php,start_register.php 文件

Events.php
<?php
/**
 * This file is part of workerman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author walkor<[email protected]>
 * @copyright walkor<[email protected]>
 * @link http://www.workerman.net/
 * @license http://www.opensource.org/licenses/mit-license.php MIT License
 */
/**
 * 用于检测业务代码死循环或者长时间阻塞等问题
 * 如果发现业务卡死,可以将下面declare打开(去掉//注释),并执行php start.php reload
 * 然后观察一段时间workerman.log看是否有process_timeout异常
 */
//declare(ticks=1);

use \GatewayWorker\Lib\Gateway;

/**
 * 主逻辑
 * 主要是处理 onConnect onMessage onClose 三个方法
 * onConnect 和 onClose 如果不需要可以不用实现并删除
 */
class Events
{
    /**
     * 当客户端连接时触发
     * 如果业务不需此回调可以删除onConnect
     * 
     * @param int $client_id 连接id
     */
    public static function onConnect($client_id)
    {
        // 向当前client_id发送数据 
        Gateway::sendToClient($client_id, json_encode(array(
            'client_id' => $client_id
        )));
        // 向所有人发送
        //Gateway::sendToAll("$client_id 风起时");
    }
    
   /**
    * 当客户端发来消息时触发
    * @param int $client_id 连接id
    * @param mixed $message 具体消息
    */
   public static function onMessage($client_id, $message)
   {
        // 向所有人发送 
        //Gateway::sendToAll("$client_id said $message\r\n");
       //echo $message;
   }
   
   /**
    * 当用户断开连接时触发
    * @param int $client_id 连接id
    */
   public static function onClose($client_id)
   {
       // 向所有人发送 
       //GateWay::sendToAll("$client_id logout\r\n");
   }

    // 进程启动时设置个定时器。Events中支持onWorkerStart需要Gateway版本>=2.0.4
    /*public static function onWorkerStart()
    {
        \Workerman\Timer::add(1, function(){
            echo "fengqishi\n";
            \app\common\model\CharteredBusCancelCause::create(['cause' => rand(100, 999)]);
        });
    }*/
}

tart_businessworker.php

<?php 
/**
 * This file is part of workerman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author walkor<[email protected]>
 * @copyright walkor<[email protected]>
 * @link http://www.workerman.net/
 * @license http://www.opensource.org/licenses/mit-license.php MIT License
 */
use \Workerman\Worker;
use \Workerman\WebServer;
use \GatewayWorker\Gateway;
use \GatewayWorker\BusinessWorker;
use \Workerman\Autoloader;

// 自动加载类
require_once __DIR__ . '/../../../vendor/autoload.php';
require_once __DIR__ . '/Events.php';
// bussinessWorker 进程
$worker = new BusinessWorker();
// worker名称
$worker->name = 'landian';
// bussinessWorker进程数量
$worker->count = 1;
// 服务注册地址
$worker->registerAddress = '127.0.0.1:1241';
$worker->eventHandler = "Events";

// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START'))
{
    Worker::runAll();
}

start_gateway.php

<?php 
/**
 * This file is part of workerman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author walkor<[email protected]>
 * @copyright walkor<[email protected]>
 * @link http://www.workerman.net/
 * @license http://www.opensource.org/licenses/mit-license.php MIT License
 */
use \Workerman\Worker;
use \Workerman\WebServer;
use \GatewayWorker\Gateway;
use \GatewayWorker\BusinessWorker;
use \Workerman\Autoloader;

// 自动加载类
require_once __DIR__ . '/../../../vendor/autoload.php';

// gateway 进程,这里使用Text协议,可以用telnet测试
$gateway = new Gateway("websocket://0.0.0.0:8288");
// gateway名称,status方便查看
$gateway->name = 'landian';
// gateway进程数
$gateway->count = 4;
// 本机ip,分布式部署时使用内网ip
$gateway->lanIp = '127.0.0.1';
// 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口 
$gateway->startPort = 4004;
// 服务注册地址1236
$gateway->registerAddress = '127.0.0.1:1241';

// 心跳间隔
$gateway->pingInterval = 10;
// 心跳数据
$gateway->pingData = '{"type":"ping"}';

/* 
// 当客户端连接上来时,设置连接的onWebSocketConnect,即在websocket握手时的回调
$gateway->onConnect = function($connection)
{
    $connection->onWebSocketConnect = function($connection , $http_header)
    {
        // 可以在这里判断连接来源是否合法,不合法就关掉连接
        // $_SERVER['HTTP_ORIGIN']标识来自哪个站点的页面发起的websocket链接
        if($_SERVER['HTTP_ORIGIN'] != 'http://kedou.workerman.net')
        {
            $connection->close();
        }
        // onWebSocketConnect 里面$_GET $_SERVER是可用的
        // var_dump($_GET, $_SERVER);
    };
}; 
*/

// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START'))
{
    Worker::runAll();
}

  start_register.php

<?php 
/**
 * This file is part of workerman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author walkor<[email protected]>
 * @copyright walkor<[email protected]>
 * @link http://www.workerman.net/
 * @license http://www.opensource.org/licenses/mit-license.php MIT License
 */
use \Workerman\Worker;
use \GatewayWorker\Register;

// 自动加载类
require_once __DIR__ . '/../../../vendor/autoload.php';

// register 必须是text协议
$register = new Register('text://0.0.0.0:1241');

// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START'))
{
    Worker::runAll();
}

 # 根目录下新建 start.php

<?php
/**
 * run with command
 * php start.php start
 */

ini_set('display_errors', 'on');
use Workerman\Worker;

if(strpos(strtolower(PHP_OS), 'win') === 0)
{
    exit("start.php not support windows, please use start_for_win.bat\n");
}

// 检查扩展
if(!extension_loaded('pcntl'))
{
    exit("Please install pcntl extension. See http://doc3.workerman.net/appendices/install-extension.html\n");
}

if(!extension_loaded('posix'))
{
    exit("Please install posix extension. See http://doc3.workerman.net/appendices/install-extension.html\n");
}

// 标记是全局启动
define('GLOBAL_START', 1);
define('DS', DIRECTORY_SEPARATOR);
define('ROOT_PATH', __DIR__ . DS);
require_once __DIR__ . '/vendor/autoload.php';

// 加载所有Applications/*/start.php,以便启动所有服务
foreach(glob(__DIR__.'/application/api/fengqishi/start*.php') as $start_file)
{
    require_once $start_file;
}
// 运行所有服务
Worker::runAll();

启动 workerman 服务 php start.php start
停止 workerman 服务 php start.php stop
重启 workerman 服务 php start.php restart
Workerman服务状态 php start.php status

 

# 前段连接 workerman 在伪静态设置
location /wss {
proxy_pass http://127.0.0.1:8288;
proxy_connect_timeout 30s;
proxy_read_timeout 86400s;
proxy_send_timeout 30s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}

 

注意:workerman 端口 8288 和 1241 ;composer包gateway-worker文件和gatewayclient文件也需要同步修改 1241 端口
# composer包 默认端口号 1236

 

启动成功后
# 绑定操作
public function bindClientId()
{
  #client_id 前段传参数
  $client_id = $this->request->post('client_id', '');
  $user_id = ""; //用户ID
  if (!empty($client_id)){
  Gateway::bindUid($client_id, $user_id);
  }
  $this->success();
}
# 推送操作
public function demo(){
  $user_id = ""; //用户ID
  Gateway::sendToUid($user_id,json_encode([
    'type' => 'order', //类型前段接受
  ]));
}

 

 

标签:服务,gateway,client,workerman,http,php,id
From: https://www.cnblogs.com/ixiangang06/p/18119535

相关文章

  • 阿里云服务器+NAS
    什么是ECSECS:即ElasticComputeService弹性计算(ElasticComputing)是一种云计算服务模型,它旨在提供灵活、自动且可伸缩的计算资源。弹性计算的关键特性包括:弹性伸缩:用户可以根据实际需求自动调整计算资源的规模,实现按需分配和释放。这意味着在峰值时段增加资源,而在负载较......
  • CentOS安装RustDesk自建服务器
    一、安装node.js1、下载并解压[root@VM-8-2-centossrc]#cd/usr/local#下载node文件[root@VM-8-2-centoslocal]#wgethttps://registry.npmmirror.com/-/binary/node/v16.18.1/node-v16.18.1-linux-x64.tar.gz#解压文件[root@VM-8-2-centoslocal]#sudotar-zxvfno......
  • spring boot admin服务端配置邮件通知、钉钉通知
    根据下面的可选项配置邮件表格6.邮件提醒配置的可选项属性名说明面若防治spring.boot.admin.notify.mail.enabled开启邮件提醒truespring.boot.admin.notify.mail.ignore-changes要忽略的状态变化,使用逗号分割。格式是:"<from-status>:<to-status>"。......
  • windows服务器间文件同步--Syncthing
    一、说明:Syncthing免费且开源,跨平台支持Windows、Mac、Linux、Android等主流平台,除了PC、手机以外,在部分路由器、树莓派等硬件上都能轻松运行,它将以网页版的形式呈现,并且Syncthing还提供了中文界面的支持。二、下载官网下载地址:https://syncthing.net/downloads/按照自......
  • 使用miniforge平替anaconda,重建airflow服务
    背景因公司通知不能使用anaconda,可以采用miniforge作为开源平替,因之前环境搭建使用的就是anaconda,当前需要卸载并替换成miniforge。那为什么一定要用这个呢,其实也不是一定,而是用这个搭建环境比较省事,如果没用这个,我当前环境的python版本过低,解决这个问题耗费的时间会更久,所以最......
  • 因为算法不同,客户端与服务器无法通信。”的解决方法
    因为算法不同,客户端与服务器无法通信。”的解决方法sqlserver客户端远程sqlserver服务器 或是mstsc 最后根据微软文档的说明,改动注册表就成功了:传输层安全性(TLS)注册表设置|MicrosoftDocs在注册表编辑器,找到以下注册表项/文件夹:HKEY_LOCAL_MACHINE\SYSTEM\Curren......
  • 在Centos 8 服务器用tmux多开窗口
    在CentOS服务器上使用tmux来多开窗口是一个高效的方式。tmux是一个终端复用器,它允许你在一个终端窗口中打开多个终端会话,还可以在会话之间轻松切换,非常适合长时间运行程序或多任务操作。下面是如何使用tmux来多开窗口的基本步骤:1.安装tmux如果你的系统还没有安装tmux,......
  • 微服务简介
    1.软件架构的演变早期的软件,所有功能都集中在一起,这种软件集中、代码庞大、功能耦合的软件架构,称为单体架构(monolithicsoftware)。整个软件就是单一的整体,仿佛一体化的机器。可以想到,软件的功能越多,单体架构就越复杂。很多缺点也随之暴露出来。所有功能耦合在一起,互相影响,最终......
  • Android Binder——Java服务注册(九)
           对于Java端使用Binder服务,主要就是注册服务和获取服务,入口都是通过ServiceManager.java中的对应方法实现。这里我们就先介绍一下Java注册Binder服务的流程。一、ServiceManager代理       无论是ServiceManager.addService()还是Service......
  • (免费赠源码)计算机毕设题目:基于微信小程序的旅游服务系统 77397(开题答辩+程序定制+全套
    springboot旅游服务系统小程序摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,旅游服务系统小程序管理系统被用户普遍使用,为方便用户能够可以随时进行旅游服务系统小......