在查看服务端主动推送给客户端消息的例子时发现,大多数代码都是写在回调函数(最普遍的是onMessage函数)里的。 本人现在要实现的场景是服务端不定期主动向客户端推送消息,代码上我想在类文件里写一个方法外部调用,这样的话就会有个问题, 找不到$connection , 继而$connection->send() 无法使用。
这个问题该如何处理呢? 谢谢
每个 Worker 是一个监听容器,所有正在通信的连接都保存在 $worker->connections 里面。
但是你想要主动给客户端推送信息的时候,首先自己得知道推送给哪个客户端(除非你是要广播,那样的话直接遍历 $worker->connections 就可以了),所以你得自己想办法来维护一个类似 client_id 的东西,用于找到特定的客户端。
如果你使用 GatewayWorker 或者 PHPSocketIO 的话,这样的机制已经存在了。
再有,【在类文件里写一个方法外部调用】这个说法是有问题的。
Workerman 是一个 CLI 方式运行的进程,所以跟传统意义上 Web 应用里的 PHP 程序文件不一样。【类文件】不是一个等待被调用的东西,它自己就是一个进程,没有【外部调用】。想要主动向客户端推送消息,有两个可能的途径:一个是用定时器触发,一个是类似 web-msg-sender 那样以网络通信的方式接收来自外部的指令并进行相应的操作。
每个 Worker 是一个监听容器,所有正在通信的连接都保存在 $worker->connections 里面。
但是你想要主动给客户端推送信息的时候,首先自己得知道推送给哪个客户端(除非你是要广播,那样的话直接遍历 $worker->connections 就可以了),所以你得自己想办法来维护一个类似 client_id 的东西,用于找到特定的客户端。
如果你使用 GatewayWorker 或者 PHPSocketIO 的话,这样的机制已经存在了。
再有,【在类文件里写一个方法外部调用】这个说法是有问题的。
Workerman 是一个 CLI 方式运行的进程,所以跟传统意义上 Web 应用里的 PHP 程序文件不一样。【类文件】不是一个等待被调用的东西,它自己就是一个进程,没有【外部调用】。想要主动向客户端推送消息,有两个可能的途径:一个是用定时器触发,一个是类似 web-msg-sender 那样以网络通信的方式接收来自外部的指令并进行相应的操作。