经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Swoole » 查看文章
Laravel使用swoole实现websocket主动消息推送的方法介绍
来源:jb51  时间:2019/10/21 8:38:11  对本文有异议

需求

需要实现一个可以主动触发消息推送的功能,这个可以实现向模板消息那个,给予所有成员发送自定义消息,而不需要通过客户端发送消息,服务端上message中监听传送的消息进行做相对于的业务逻辑。

主动消息推送实现

平常我们采用 swoole 来写 WebSocket 服务可能最多的用到的是open,message,close这三个监听状态,但是万万没有看下下面的onRequest回调的使用,没错,解决这次主动消息推送的就是需要用onRequest回调。

官方文档:正因为swoole_websocket_server继承自swoole_http_server,所以在 websocket 中有onRequest回调。

详细实现

  1. # 这里是一个laravel中Commands
  2. # 运行php artisan swoole start 即可运行
  3. <?php
  4.  
  5. namespace App\Console\Commands;
  6.  
  7. use Illuminate\Console\Command;
  8. use swoole_websocket_server;
  9.  
  10. class Swoole extends Command
  11. {
  12. public $ws;
  13. /**
  14. * The name and signature of the console command.
  15. *
  16. * @var string
  17. */
  18. protected $signature = 'swoole {action}';
  19.  
  20. /**
  21. * The console command description.
  22. *
  23. * @var string
  24. */
  25. protected $description = 'Active Push Message';
  26.  
  27. /**
  28. * Create a new command instance.
  29. *
  30. * @return void
  31. */
  32. public function __construct()
  33. {
  34. parent::__construct();
  35. }
  36.  
  37. /**
  38. * Execute the console command.
  39. *
  40. * @return mixed
  41. */
  42. public function handle()
  43. {
  44. $arg = $this->argument('action');
  45. switch ($arg) {
  46. case 'start':
  47. $this->info('swoole server started');
  48. $this->start();
  49. break;
  50. case 'stop':
  51. $this->info('swoole server stoped');
  52. break;
  53. case 'restart':
  54. $this->info('swoole server restarted');
  55. break;
  56. }
  57. }
  58.  
  59. /**
  60. * 启动Swoole
  61. */
  62. private function start()
  63. {
  64. $this->ws = new swoole_websocket_server("0.0.0.0", 9502);
  65. //监听WebSocket连接打开事件
  66. $this->ws->on('open', function ($ws, $request) {
  67. });
  68. //监听WebSocket消息事件
  69. $this->ws->on('message', function ($ws, $frame) {
  70. $this->info("client is SendMessage\n");
  71. });
  72. //监听WebSocket主动推送消息事件
  73. $this->ws->on('request', function ($request, $response) {
  74. $scene = $request->post['scene']; // 获取值
  75. $this->info("client is PushMessage\n".$scene);
  76. });
  77. //监听WebSocket连接关闭事件
  78. $this->ws->on('close', function ($ws, $fd) {
  79. $this->info("client is close\n");
  80. });
  81. $this->ws->start();
  82. }
  83. }

前面说的是 swoole 中onRequest的实现,下面实现下在控制器中主动触发onRequest回调。实现方法就是我们熟悉的curl请求。

  1. # 调用activepush方法以后,会在cmd中打印出
  2. # client is PushMessage 主动推送消息 字眼
  3. /**
  4. * CURL请求
  5. * @param $data
  6. */
  7. public function curl($data)
  8. {
  9. $curl = curl_init();
  10. curl_setopt($curl, CURLOPT_URL, "http://127.0.0.1:9502");
  11. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  12. curl_setopt($curl, CURLOPT_HEADER, 1);
  13. curl_setopt($curl, CURLOPT_POST, 1);
  14. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  15. curl_exec($curl);
  16. curl_close($curl);
  17. }
  18. /**
  19. * 主动触发
  20. */
  21. public function activepush()
  22. {
  23. $param['scene'] = '主动推送消息';
  24. $this->curl($param); // 主动推送消息

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对w3xue的支持。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号