【发布时间】:2021-07-26 14:19:25
【问题描述】:
我是 websockets 的新手,我想在我的 Laravel 应用程序中实现这样的服务。 我已经阅读了有关此主题的几篇文章/页面,但没有一个解释我需要做什么。他们都展示了如何创建一个“Echo”websocket 服务器,服务器只响应从客户端收到的消息,这不是我的情况。
作为起始基础,我使用了以下提供的代码:
从命令行或其他控制台运行 websocket 服务器的位置。服务器有自己的类来定义它并导入 WebSocketController 类(MessageComponentInterface),其中包含经典的 WebSocket 服务器事件(onOpen、onMessage、onClose、onError)。
一切正常,但是,我如何“告诉”WebSocket 服务器从另一个类(也属于另一个命名空间)向特定连接(客户端)发送消息?这是通知或事件的情况,其中必须将新的 Web 内容发送到该特定客户端。客户端没有订阅或发布。
正如@Alias 在他的帖子Ratchet PHP - Push messaging service 中所问的那样,我显然无法创建 Websocket 服务器或其事件管理类的新实例,那么向客户端发送内容或消息的最佳方法是什么?
正如大家所见,通信只有一种方式:从 WebSocket 服务器到客户端,而不是相反。 我已经为此准备了一个通知类和一个侦听器类,但是我仍然不知道如何通过 handle() 方法解决与客户端的通信:
namespace App\Listeners;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Events\NotificationSent;
use Illuminate\Queue\InteractsWithQueue;
class LogNotification
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param NotificationSent $event
* @return void
*/
public function handle(NotificationSent $event)
{
// Can content or message be sent to the client from here? how?
}
}
【问题讨论】:
-
好吧,我一直在使用 RatchetPHP/Pawl,它作为 PHP 客户端工作,但它也阻止了我的 javascript websocket 客户端。一旦 Pawl 断开连接,javascript websocket 客户端就会连接。看起来 Pawl 创建的循环阻止了 js 客户端。我需要 PHP 中的一些东西来向 JS websocket 客户端发送通知,而不会阻止它们。
-
通过安装 amphp/websocket-client 我可以有一个 PHP 客户端连接,向 websocket 服务器发送一条消息并告诉它发送回复到另一个连接。但是,如果用户浏览应用程序菜单/链接,随后的 HTML 请求会断开 javascript websocket 客户端。稍微阅读一下,我需要将 JS websocket 保留在 web worker 中,以保持连接处于活动状态。如果没有,则会在下一页建立一个新连接,这会使事情更难维护,并产生更多的网络流量来更新连接表/列表。
标签: php laravel notifications pusher ratchet