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

andolee

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

5995 1 0
1个回答

walkor

系统默认不允许两个程序监听同一个端口,因为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();
年代过于久远,无法发表回答
🔝