請問workerman做服務(wù)端推送功能,不能監(jiān)聽80端口嗎?
我的web服務(wù)器用apache搭建,有個后臺系統(tǒng),請問后臺系統(tǒng)如何推送給80端口的客戶端呢?
系統(tǒng)默認(rèn)不允許兩個程序監(jiān)聽同一個端口,因為apache已經(jīng)監(jiān)聽了80端口,那么workerman就不能再監(jiān)聽80端口了。
不過可以用workerman做個tcp代理
1、假設(shè)你的apache改成監(jiān)聽8080端口
2、假設(shè)你的workerman websocket程序監(jiān)聽8282端口
3、tcp代理會監(jiān)聽80端口(80端口需要root權(quán)限才能監(jiān)聽)
4、tcp代理識別客戶端發(fā)來的數(shù)據(jù)是websocket數(shù)據(jù),則會轉(zhuǎn)發(fā)給8282端口
5、tcp代理識別客戶端發(fā)來的是http數(shù)據(jù),則會轉(zhuǎn)發(fā)給8080apache端口
代理代碼如下,測試可用
<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
require_once './Workerman/Autoloader.php';
// 假如你的workerman websocket監(jiān)聽的是8282端口
define('WEB_SOCKET_PORT', 8282);
// apache監(jiān)聽8080端口
define('HTTP_PORT', 8080);
// 代理監(jiān)聽80端口
$worker = new Worker('tcp://0.0.0.0:80');
$worker->count = 4;
$worker->onMessage = function($connection, $data)
{
// 數(shù)據(jù)中有這個關(guān)鍵字為websocket請求,向websocket端口(workerman)轉(zhuǎn)發(fā)請求
if(strpos($data ,'Sec-WebSocket-Key'))
{
$ws_connection = new AsyncTcpConnection('tcp://127.0.0.1:'.WEB_SOCKET_PORT);
// 將已經(jīng)收到數(shù)據(jù)發(fā)給websocket端口
$ws_connection->send($data);
// 客戶端發(fā)來的數(shù)據(jù)轉(zhuǎn)發(fā)給websocket端口
$connection->pipe($ws_connection);
// websocket端口的數(shù)據(jù)轉(zhuǎn)發(fā)給客戶端
$ws_connection->pipe($connection);
// 執(zhí)行連接
$ws_connection->connect();
}
// 是普通http協(xié)議,向http端口(apache、nginx等)轉(zhuǎn)發(fā)數(shù)據(jù)
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();
}
};
// 運(yùn)行worker
Worker::runAll();