情况:
有一个长时间运行的任务需要异步启动。此任务的细节实际上并不是那么重要(基础知识是要配置多个虚拟机和复杂的网络设置),并且这是由将在不同服务器上运行的 python 脚本处理的。我们决定使用 WebSockets 在 Web 服务器和客户端之间进行来回通信,并且我在那里可以进行双向通信。 Web 服务器将向其他服务器发送请求,并在每台计算机启动并运行时接收从 python 脚本返回的 HTTP POST 通知,并在整个网络启动时接收最终的 HTTP POST 通知。
所有这些都有效。我们在 Web 服务器上使用的框架是 Laravel 4,并且 Web 套接字服务器是使用Ratchet,并在 artisan 命令中实现。我的问题是我不确定如何将 HTTP POST 从 python 脚本中继到 Laravel 控制器到 WebSocket 服务器,以便它反过来可以将该信息中继回客户端。
下面是 Ratchet 的实现MessageComponentInterface::onMessage
方法,它使用观察者模式来通知消息事件的任何订阅侦听器。
// Class: SocketMessenger
public function onMessage(ConnectionInterface $from, $msg) {
$respondTo = null;
foreach($this->_clients as $client) {
if($client->resourceId == $from->resourceId) {
$respondTo = $client;
break;
}
}
$msg = json_decode($msg, true);
if(!$respondTo || !$msg || !isset($msg['type'])) {
echo 'Malformed Socket Message Received, Rejecting.';
return;
}
$type = $msg['type'];
// Notify any subscribed listeners with this message type of the
// incoming message. Any response received will be relayed back to
// the client.
if(isset($this->_listeners[$type])) {
foreach( $this->_listeners[$type] as $listener ) {
$response = $listener->notify( $respondTo, $msg );
if($response) {
$respondTo->send( $response );
}
}
}
}
WebSocket 服务器是在服务提供者中构建的,如下所示:
// Class: SocketServiceProvider
$app->bind( 'Ratchet\MessageComponentInterface', function( $app, $params ) {
$port = $params && isset($params[0]) ?
$params[0] : self::DEFAULT_PORT
;
$messenger = new SocketMessenger;
// Setup the Ratchet Server.
$server = IoServer::factory(
new HttpServer(
new WsServer(
$messenger
)
),
$port
);
// Subscribe socket listeners to the socket messenger
$messenger->subscribe( new TopologyMessageListener, TopologyMessageListener::TYPE );
return $server;
} );
有没有什么方法可以将请求发送到 Laravel 控制器,并在给定控制器的方法被命中时通知正在运行的 WebSocket 服务器?