【GatewayWorker】实现发送指定php接口名字调用指定php接口
GatewayWorker工作原理
工作流程
- Register、Gateway、BusinessWorker进程启动;
- Gateway、BusinessWorker进程启动后向Register服务进程发起长连接注册自己;
- Register服务收到Gateway的注册后,把所有Gateway的通讯地址保存在内存中
- Register服务收到BusinessWorker的注册后,把内存中所有的Gateway的通讯地址发给BusinessWorker;
- BusinessWorker进程得到所有的Gateway内部通讯地址后尝试连接Gateway;
- 如果运行过程中有新的Gateway服务注册到Register(一般是分布式部署加机器),则将新的Gateway内部通讯地址列表将广播给所有BusinessWorker,BusinessWorker收到后建立连接;
- 如果有Gateway下线,则Register服务会收到通知,会将对应的内部通讯地址删除,然后广播新的内部通讯地址列表给所有BusinessWorker,BusinessWorker不再连接下线的Gateway;
- 至此Gateway与BusinessWorker通过Register已经建立起长连接;
- 客户端的事件及数据全部由Gateway转发给BusinessWorker处理,BusinessWorker默认调用Events.php中的onConnect onMessage onClose处理业务逻辑;
- 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";
}
需求测试