新版订单消耗系统

EmailQueue.php 1.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <?php
  2. /**
  3. * User: wangsai
  4. * Date: 2019/11/5
  5. * Time: 14:38
  6. */
  7. namespace App\Support;
  8. use App\RedisModel;
  9. use Cache;
  10. class EmailQueue
  11. {
  12. const KEY = 'tbk_onlive_admin_email_queue_key';
  13. /**
  14. * @param $title
  15. * @param $content
  16. * @param $emails
  17. * @param $sender
  18. */
  19. public static function rPush($title, $content, $emails, $sender = '')
  20. {
  21. // 防止大量错误导致队列堆积
  22. if (RedisModel::lLen(self::KEY) > 1000) {
  23. return;
  24. }
  25. $emailData = json_encode([$title, $content, (array) $emails, $sender], JSON_UNESCAPED_UNICODE);
  26. RedisModel::rPush(self::KEY, $emailData);
  27. }
  28. public static function send()
  29. {
  30. $beginTime = time();
  31. while (true) {
  32. $emailData = RedisModel::lPop(self::KEY);
  33. if (empty($emailData)) {
  34. break;
  35. }
  36. call_user_func_array([Email::class, 'send'], json_decode($emailData, true));
  37. $now = time();
  38. // 超过1分钟,主动停止循环
  39. if ($now - $beginTime > 60) {
  40. break;
  41. }
  42. }
  43. }
  44. }