请问workerman做服务端推送功能,不能监听80端口吗?

0

请问workerman做服务端推送功能,不能监听80端口吗?
我的web服务器用apache搭建,有个后台系统,请问后台系统如何推送给80端口的客户端呢?

已邀请:

walkor

赞同来自: andolee

系统默认不允许两个程序监听同一个端口,因为apache已经监听了80端口,那么workerman就不能再监听80端口了。


不过可以用workerman做个tcp代理


1、假设你的apache改成监听8080端口
2、假设你的workerman websocket程序监听8282端口
3、tcp代理会监听80端口(80端口需要root权限才能监听)
4、tcp代理识别客户端发来的数据是websocket数据,则会转发给8282端口
5、tcp代理识别客户端发来的是http数据,则会转发给8080apache端口


代理代码如下,测试可用


<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
require_once './Workerman/Autoloader.php';

// 假如你的workerman websocket监听的是8282端口
define('WEB_SOCKET_PORT', 8282);
// apache监听8080端口
define('HTTP_PORT', 8080);

// 代理监听80端口
$worker = new Worker('tcp://0.0.0.0:80');
$worker->count = 4;
$worker->onMessage = function($connection, $data)
{
// 数据中有这个关键字为websocket请求,向websocket端口(workerman)转发请求
if(strpos($data ,'Sec-WebSocket-Key'))
{
$ws_connection = new AsyncTcpConnection('tcp://127.0.0.1:'.WEB_SOCKET_PORT);
// 将已经收到数据发给websocket端口
$ws_connection->send($data);
// 客户端发来的数据转发给websocket端口
$connection->pipe($ws_connection);
// websocket端口的数据转发给客户端
$ws_connection->pipe($connection);
// 执行连接
$ws_connection->connect();
}
// 是普通http协议,向http端口(apache、nginx等)转发数据
else
{
$http_connection = new AsyncTcpConnection('tcp://127.0.0.1:'.HTTP_PORT);
$http_connection->send($data);
$connection->pipe($http_connection);
$http_connection->pipe($connection);
$http_connection->connect();
}
};
// 运行worker
Worker::runAll();

要回复问题请先登录注册