SwooleWorkerStart.php 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. namespace app\webscoket;
  3. use ln\interfaces\ListenerInterface;
  4. use Swoole\Server;
  5. use Swoole\Timer;
  6. use think\Config;
  7. /**
  8. * Class SwooleWorkerStart
  9. * @package app\webscoket
  10. * @author zfy
  11. * @day 2020-04-29
  12. */
  13. class SwooleWorkerStart implements ListenerInterface
  14. {
  15. /**
  16. * @var \Swoole\WebSocket\Server
  17. */
  18. protected $server;
  19. /**
  20. * @var Config
  21. */
  22. protected $config;
  23. /**
  24. * SwooleWorkerStart constructor.
  25. * @param Server $server
  26. * @param Config $config
  27. */
  28. public function __construct(Server $server, Config $config)
  29. {
  30. $this->server = $server;
  31. $this->config = $config;
  32. }
  33. /**
  34. * @param $event
  35. * @author zfy
  36. * @day 2020-04-29
  37. */
  38. public function handle($event): void
  39. {
  40. if (!env('INSTALLED', false)) return;
  41. if ($this->server->worker_id == ($this->config->get('swoole.server.options.worker_num')) && $this->config->get('swoole.websocket.enable', false)) {
  42. $this->ping();
  43. }
  44. }
  45. /**
  46. * @author zfy
  47. * @day 2020-05-06
  48. */
  49. protected function ping()
  50. {
  51. /**
  52. * @var $pingService Ping
  53. */
  54. $pingService = app()->make(Ping::class);
  55. $server = $this->server;
  56. $timeout = (int)($this->config->get('swoole.websocket.ping_timeout', 60000) / 1000);
  57. Timer::tick(1500, function (int $timer_id) use (&$server, &$pingService, $timeout) {
  58. $nowTime = time();
  59. foreach ($server->connections as $fd) {
  60. if ($server->isEstablished($fd) && $server->exist($fd)) {
  61. $last = $pingService->getLastTime($fd);
  62. if ($last && ($nowTime - $last) > $timeout) {
  63. $server->close($fd);
  64. }
  65. }
  66. }
  67. });
  68. }
  69. }