上一篇文章写过workerman作为转发程序的代码和思路,需求2:想通过http接口动态改变转发程序所连接的服务器地址
思路:
第一步,通过workerman的 listen 接口 创建一个 监听程序,监听一个http 接口对外开放,这就打开了接口这一环节
第二步,通过这个接口拿到改变的服务端IP连接IP地址改变动态链接
第三步,改变动态连接,我使用了在接口接过来的时候重新初始化连接程序,销毁上一个,初始化下一个连接地址
代码:
必须是PHP7 版本以上的,不然监听程序会报错
// 这里主要是针对 onWorkerStart 做出的处理
$worker->onWorkerStart = function ($worker) {
global $connection_to_server;
// 开启一个内部端口,方便内部系统推送数据,http协议格式 文本+换行符
$inner_worker = new Worker('http://0.0.0.0:2016');
// 设置端口复用,可以创建监听相同端口的Worker(需要PHP>=7.0)
$inner_worker->reusePort = true;
// 跨域处理
$inner_worker->onWorkerStart = function ($connection) {
$connection->headers = [
'Access-Control-Allow-Origin: *',
'Access-Control-Allow-Methods:POST',
'Access-Control-Allow-Headers:x-requested-with,content-type'
];
};
// 对外接口收到消息
$inner_worker->onMessage = function ($connection, $buffer) {
global $connection_to_server;
global $serverUrl;
global $events_funtion;
// 跨域
\Workerman\Protocols\Http::header('Access-Control-Allow-Origin: *');
// 回复对外接口页面
$connection->send('true');
// 得到双方通讯唯一对象 方便中转程序发送消息
global $connection1, $connection2;
if (!empty($_REQUEST['setIp'])) {
if ($connection_to_server != null) {
$connection_to_server->close();
}
$serverUrl = 'tcp://' . $_REQUEST['setIp'];
// 链接真实服务器
$connection_to_server = new AsyncTcpConnection($serverUrl);
// 接到真实服务器响应信息,返回给客户端
$connection_to_server->onMessage = function ($connection_to_server, $buffer) use ($connection) {
global $connection1;
global $connection2;
// 写你自己的业务逻辑
};
$connection_to_server->connect();
}
};
// 执行监听。正常监听不会报错
$inner_worker->listen();
};
以上就是workerman关于转发程序动态地址的代码,不懂得请联系我邮箱或者QQ 1263078673@qq.com 1263078673