请问workerman做服务端推送功能,不能监听80端口吗? 我的web服务器用apache搭建,有个后台系统,请问后台系统如何推送给80端口的客户端呢?
系统默认不允许两个程序监听同一个端口,因为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();
嗯 感谢 我试一下···
系统默认不允许两个程序监听同一个端口,因为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端口
代理代码如下,测试可用
嗯 感谢 我试一下···