workerman,GatewayWorker将http传统web请求转发给socket,tcp服务,在一个普通的Web项目中通过GatewayWorker推送数据
项目中使用GatewayWorker作为服务端,业务逻辑都在workerman中实现,客户端只能通过socket拉取数据,同时又有些第三方服务会发送http请求给服务器,
比如支付回调,为解决这一问题,只好将http请求转发给workerman,处理完再将结果响应给http请求
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(); }此处通过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请求