Kernel.php 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <?php
  2. namespace app\task;
  3. use app\task\time\DemoTime;
  4. use think\Cache;
  5. use think\Console;
  6. /**
  7. * 定时任务管理器
  8. * 业务代码执行时间过长,会造成堵塞,请合理安排执行任务
  9. * Class Kernel
  10. * @package app\task
  11. * Author: Panda joeyoung0314@qq.com
  12. * Gitee: https://gitee.com/xertao
  13. */
  14. class Kernel{
  15. /**
  16. * 定时组
  17. * 业务代码 业务代码执行时间过长,会造成堵塞,请合理安排执行任务。
  18. * 过于复杂的业务需求建议搭配异步进行处理,定时任务作为触发功能使用。
  19. * $this->command('DemoTime','10:08','at');// 每天指定时间点触发
  20. * $this->command('DemoTime','1','minute');// 默认间隔1分钟触发 daily 单位分钟
  21. * @return void
  22. */
  23. public function schedule()
  24. {
  25. $this->command(DemoTime::class,'1','minute');// 默认间隔1分钟触发 daily 单位分钟
  26. }
  27. /**
  28. * 定时任务触发时间
  29. * @param $class
  30. * @param string $daily
  31. * @param string $type
  32. * @return false|\think\console\Output
  33. */
  34. private function command($class,string $daily = '',string $type = 'minute')
  35. {
  36. // 按分钟、按每天指定点数
  37. if (!in_array($type,['minute','at'])) {
  38. return false;
  39. }
  40. if (!empty($daily)) {
  41. switch ($type){
  42. case 'minute':
  43. $run_time = Cache::get("task_{$class}_{$type}_{$daily}");
  44. if (ceil((time() - $run_time) / 60) < $daily){
  45. return false;
  46. }
  47. Cache::set("task_{$class}_{$type}_{$daily}",time());
  48. break;
  49. case 'at':
  50. if (date('H:i') != $daily){
  51. return false;
  52. }
  53. break;
  54. default:
  55. return false;
  56. }
  57. }
  58. return (new $class)->execute();
  59. }
  60. }