GatewayWorker转发http请求给socket服务

it2025-08-11  11

workerman,GatewayWorker将http传统web请求转发给socket,tcp服务,在一个普通的Web项目中通过GatewayWorker推送数据

介绍

项目中使用GatewayWorker作为服务端,业务逻辑都在workerman中实现,客户端只能通过socket拉取数据,同时又有些第三方服务会发送http请求给服务器,

比如支付回调,为解决这一问题,只好将http请求转发给workerman,处理完再将结果响应给http请求

流程

GatewayWorker中开启一个内部Gateway端口,用于接收推送数据在WebServer中获取请求数据,封装成socket服务要求的格式将数据发送给内部Gateway端口读取推送结果响应web请求

示例代码

开启内部端口

start_text_gateway.php

<?php use \Workerman\Worker; use \GatewayWorker\Gateway; use \Workerman\Autoloader; require_once __DIR__ . '/../vendor/autoload.php'; Autoloader::setRootPath(__DIR__); // #### 内部推送端口(假设当前服务器内网ip为192.168.100.100) #### // #### 端口不能与原来start_gateway.php中一样 #### $internal_gateway = new Gateway("Text://127.0.0.1:7273"); $internal_gateway->name='internalGateway'; // #### 不要与原来start_gateway.php的一样#### // #### 比原来跨度大一些,比如在原有startPort基础上+1000 #### $internal_gateway->startPort = 3300; // #### 这里设置成与原start_gateway.php 一样 #### $internal_gateway->registerAddress = '127.0.0.1:1238'; // #### 内部推送端口设置完毕 #### if(!defined('GLOBAL_START')) { Worker::runAll(); }

开启web服务,

此处通过workerman实现,用其他webserver亦可以 

start_http_server.php

<?php use Workerman\Worker; // 自动加载类 require_once __DIR__ . '/../vendor/autoload.php'; $worker = new Worker('http://0.0.0.0:8088'); $worker->onMessage = function($connection, $request) { $client = stream_socket_client('tcp://127.0.0.1:7273'); if(!$client)exit("can not connect"); // 推送的数据,包含uid字段,表示是给这个uid推送 $path = substr($request->path(), 1); $param = $request->post(); $data['api'] = $path; $data['app'] = "agent"; $data['ver'] = 1; $data['data'] = $param; fwrite($client, json_encode($data)."\n"); // 读取推送结果 $msg = fread($client, 8192); // $request为请求对象,这里没有对请求对象执行任何操作直接返回hello给浏览器 $connection->send($msg); }; // 运行worker Worker::runAll();

目录结构

 通过php start.php启动

在浏览器中访问url,即可实现

效果

socket请求

http请求

 

最新回复(0)