我已經將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白名單。我可能會在短期內這樣做,但在另一個港口傾聽會是更好的解決方案。
我還沒有機會尚未嘗試這一點,但有用的提示[進來從GitHub](https://github.com/ratchetphp/Ratchet/issues/546#issuecomment-327245328)。如果有人試過這個,請告訴我你是怎麼做的! – halfer