SwooleWorkerStart.php 1.9 KB

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