2017-07-28 153 views
0

我已經將ReactPHP設置爲WebSocket偵聽器,因此我可以向訂閱的瀏覽器發送接近實時的更新。它看起來像這樣:棘輪/ ReactPHP循環可以偵聽多個端口嗎?

use Ratchet\Server\IoServer; 
use Ratchet\Http\HttpServer; 
use Ratchet\WebSocket\WsServer; 
use MyApp\Listener; 

$rootPath = realpath(__DIR__ . '/..'); 
require_once $rootPath . '/vendor/autoload.php'; 

$server = IoServer::factory(
    new HttpServer(
     new WsServer(
      new Listener() 
     ) 
    ), 
    8081 
); 
$server->run(); 

所有除了Listener這些類是棘輪的一部分,並且Listener是我的處理程序實現\Ratchet\MessageComponentInterface,這是爲了響應連接的WebSockets的開啓/關閉/錯誤事件。

我希望這個腳本可以通過我正在構建的隊列系統來聯繫,並且由於這是一個系統通道,所以我想在不同的端口上公開這個腳本,以便它不能從Internet訪問。理想情況下,這將在HTTP而不是WebSocket上;我已經成功地使用PHP WebSocket客戶端來聯繫這個監聽器,但與file_get_contents('http://...')調用相比,這有點複雜!

在猜測,內部環路陣營(例如StreamSelectLoop::streamSelect)只塊短時間(see here),所以它感覺可能的,它可以從內部管理多個單獨的流。理想情況下,我希望額外的端口由單獨的監聽器處理,以便安全隔離(如果Guzzle中的缺陷可能允許攻擊者看起來來自限制端口,實際上他們來自Internet港口)。

我認爲這不是一個不尋常的要求,但似乎沒有任何文檔中的相關信息,並且GitHub問題也很少。沒有設置並行進程或多線程,這種配置是否可行?


解決此問題的一種方法是在WebSocket偵聽器中爲特定的消息類型添加IP白名單。我可能會在短期內這樣做,但在另一個港口傾聽會是更好的解決方案。

+0

我還沒有機會尚未嘗試這一點,但有用的提示[進來從GitHub](https://github.com/ratchetphp/Ratchet/issues/546#issuecomment-327245328)。如果有人試過這個,請告訴我你是怎麼做的! – halfer

回答

1

我找到了一種方法,它可能不是最好的做法,但你可以手動添加插座,這樣的:

use Ratchet\Server\IoServer; 
use Ratchet\Http\HttpServer; 
use Ratchet\WebSocket\WsServer; 
use MyApp\Listener; 
use React\Socket\Server as Reactor; 

$server = IoServer::factory(
    new HttpServer(
     new WsServer(
      new Listener() 
     ) 
    ), 
    8081 //Port 1 
); 
$socket = new Reactor($server->loop); 
$socket->listen(8082, '0.0.0.0'); //Port 2 
$socket->on('connection', [$server, 'handleConnect']); 
$server->run(); 
+0

哦,哇,謝謝。我會試試這個! – halfer

+0

對,這是一個很好的開始,謝謝。我找不到一個名爲'Reactor'的類,但它似乎在Ratchet源中用作'React \ Socket \ Server'的別名,所以我添加了'use',服務器啓動了。它現在監聽兩個端口並將它們指向同一個處理程序。這讓我處於一個更好的位置,因爲我現在可以在'Listener'中讀取端口細節以進行安全過濾。 – halfer

+0

但是,我真正喜歡的是能夠添加第二個端口和一個完全獨立的處理程序,因此兩個端口之間會有一些分隔。我想將第二臺服務器設置爲普通HTTP而不是WebSocket。你認爲這是可能的嗎?我還沒有真正掌握ReactPHP。 – halfer