【GatewayWorker】实现发送指定php接口名字调用指定php接口

GatewayWorker工作原理

在这里插入图片描述


工作流程

  1. Register、Gateway、BusinessWorker进程启动;
  2. Gateway、BusinessWorker进程启动后向Register服务进程发起长连接注册自己;
  3. Register服务收到Gateway的注册后,把所有Gateway的通讯地址保存在内存中
  4. Register服务收到BusinessWorker的注册后,把内存中所有的Gateway的通讯地址发给BusinessWorker;
  5. BusinessWorker进程得到所有的Gateway内部通讯地址后尝试连接Gateway;
  6. 如果运行过程中有新的Gateway服务注册到Register(一般是分布式部署加机器),则将新的Gateway内部通讯地址列表将广播给所有BusinessWorker,BusinessWorker收到后建立连接;
  7. 如果有Gateway下线,则Register服务会收到通知,会将对应的内部通讯地址删除,然后广播新的内部通讯地址列表给所有BusinessWorker,BusinessWorker不再连接下线的Gateway;
  8. 至此Gateway与BusinessWorker通过Register已经建立起长连接;
  9. 客户端的事件及数据全部由Gateway转发给BusinessWorker处理,BusinessWorker默认调用Events.php中的onConnect onMessage onClose处理业务逻辑;
  10. BusinessWorker的业务逻辑入口全部在Events.php中,包括onWorkerStart进程启动事件(进程事件)、onConnect连接事件(客户端事件)、onMessage消息事件(客户端事件)、onClose连接关闭事件(客户端事件)、onWorkerStop进程退出事件(进程事件)。
    在这里插入图片描述

可实现发送指定php接口名字调用指定php接口

需求实现

Db.php文件

<?php
namespace Config;

class Db
{
    public static $db = array(
        'host' => '127.0.0.1',
        'port' => '3306',
        'user' => 'root',
        'password' => '',
        'dbname' => 'qc',
        'charset' => 'utf8',
    );
}

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<walkor@workerman.net>
 * @copyright walkor<walkor@workerman.net>
 * @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;
use \GatewayWorker\Lib\Db;

require_once('Connection.php');

/**
 * 主逻辑
 * 主要是处理 onConnect onMessage onClose 三个方法
 * onConnect 和 onClose 如果不需要可以不用实现并删除
 */
class Events
{
    /**
     * 当客户端发来消息时触发
     * @param int $client_id 连接id
     * @param mixed $message 具体消息
     */
    public static function onMessage($client_id, $message)
    {
       // 发来的消息
        //{"type":"test","incontent":{"name":"test_sht1"}}
       $resData = json_decode($message);
        $commend = $resData->type;
        $commend .='.php';
        $input = $resData->incontent;
        $ret=require_once($commend);
        
        return Gateway::sendToClient($client_id, json_encode(array(
                    'content'      => $ret
                )));

       // if ($commend=='select_test') {
        //     $ret=select_test();
        //     //return Gateway::sendToClient($client_id, var_export($ret, true));
        //     Gateway::sendToClient($client_id, json_encode(array(
        //         'type'      => $ret
        //     )));
        // } elseif ($commend=='update_test') {
        //     $ret=update_test();
        //     return Gateway::sendToClient($client_id, var_export($ret, true));
        // } elseif ($commend=='insert_test') {
        //     $ret=insert_test();
        //     return Gateway::sendToClient($client_id, var_export($ret, true));
        // } elseif ($commend=='delete_test') {
        //     $ret=delete_test();
        //     return Gateway::sendToClient($client_id, var_export($ret, true));
        // } else {
        //     Gateway::sendToClient($client_id, json_encode(array(
        //         'type'      => 'init'
        //     )));
        // }
	}
}

test.php

<?php
// $input = json_decode($input);
// $name = $input['name'];
use \GatewayWorker\Lib\Db;

require_once('Connection.php');

$content=$input->name;//获取对象的数据

$ret = Db::instance('db')->query("SELECT * FROM ".$content." WHERE `model_id`>22");

return $ret;

delete_test.php

<?php
use \GatewayWorker\Lib\Db;

require_once('Connection.php');
function delete_test()
{
    $ret = Db::instance('db')->query("DELETE FROM `test_sht1` WHERE `id`=5");
    return "DELETE_success";
}

insert_test.php

<?php
use \GatewayWorker\Lib\Db;

require_once('Connection.php');
function insert_test()
{
    $ret = Db::instance('db')->query("INSERT INTO `test_sht1`(`model_id`) VALUES(100)");
    return "insert_success";
}

select_test.php

<?php
use \GatewayWorker\Lib\Db;

require_once('Connection.php');
function select_test()
{
    $ret = Db::instance('db')->query("SELECT * FROM `test_sht1` WHERE `model_id`>22");
    return $ret;
}

update_test.php

<?php
use \GatewayWorker\Lib\Db;

require_once('Connection.php');
function update_test()
{
    $ret = Db::instance('db')->query("UPDATE `test_sht1` SET `model_id`=88 WHERE `model_id`=100");
    return "update_success";
}

需求测试

在这里插入图片描述
在这里插入图片描述

参考资料

GatewayWorker2.x 3.x 手册
workerman入门之GatewayWorker的使用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻傻虎虎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值