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