queue.php 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. declare(strict_types=0);
  3. /**
  4. * 队列
  5. *
  6. *
  7. *
  8. *
  9. */
  10. defined('InShopNC') or exit('Access Invalid!');
  11. //此行代码会导致bug
  12. //ini_set('default_socket_timeout', -1);
  13. class queueControl
  14. {
  15. private $_stop = false;
  16. public function indexOp()
  17. {
  18. if (ob_get_level()) ob_end_clean();
  19. pcntl_signal(SIGINT, [$this, 'sig_handler']);
  20. pcntl_signal(SIGHUP, [$this, 'sig_handler']);
  21. pcntl_signal(SIGQUIT, [$this, 'sig_handler']);
  22. pcntl_signal(SIGTERM, [$this, 'sig_handler']);
  23. $logic_queue = Logic('queue');
  24. $worker = new QueueServer();
  25. $queues = $worker->scan();
  26. while (true)
  27. {
  28. pcntl_signal_dispatch();
  29. if ($this->_stop) break;
  30. try
  31. {
  32. $content = $worker->pop($queues, 1);
  33. $start = microtime(true);
  34. $mem = memory_get_usage();
  35. if (is_array($content))
  36. {
  37. $method = key($content);
  38. $arg = current($content);
  39. if(!method_exists($logic_queue,$method)) {
  40. $msg = sprintf("method=$method not exist memory=$mem time=%.6f\r\n\r\n",microtime(true) - $start);
  41. Log::record($msg ,Log::DEBUG);
  42. continue;
  43. }
  44. $result = $logic_queue->$method($arg);
  45. if(is_array($result)) {
  46. Log::record($result['msg'] ?? '', Log::DEBUG);
  47. }
  48. $msg = sprintf("method=$method memory=$mem time=%.6f\r\n\r\n",microtime(true) - $start);
  49. Log::record($msg ,Log::DEBUG);
  50. }
  51. }
  52. catch (Exception $e) {
  53. $err = $e->getMessage();
  54. $code = $e->getCode();
  55. Log::record("code=$code err=$err", Log::ERR);
  56. break;
  57. }
  58. }
  59. }
  60. private function sig_handler($signo)
  61. {
  62. Log::record("queue quit at sig_handler.", Log::DEBUG);
  63. switch ($signo) {
  64. case SIGINT:
  65. case SIGHUP:
  66. case SIGQUIT:
  67. case SIGTERM:
  68. $this->_stop = true;
  69. break;
  70. default:
  71. break;
  72. }
  73. }
  74. }