Task.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <?php
  2. namespace WORKERMAN\Core\Lib;
  3. /**
  4. *
  5. * 定时任务
  6. *
  7. * <b>使用示例:</b>
  8. * <pre>
  9. * <code>
  10. * \WORKERMAN\Core\Lib\Task::init();
  11. * \WORKERMAN\Core\Lib\Task::add(5, array('class', 'method'), array($arg1, $arg2..));
  12. * <code>
  13. * </pre>
  14. * @author walkor <worker-man@qq.com>
  15. */
  16. class Task
  17. {
  18. /**
  19. * 每个任务定时时长及对应的任务(函数)
  20. * [
  21. * run_time => [[$func, $args, $persistent, timelong],[$func, $args, $persistent, timelong],..]],
  22. * run_time => [[$func, $args, $persistent, timelong],[$func, $args, $persistent, timelong],..]],
  23. * ..
  24. * ]
  25. * @var array
  26. */
  27. protected static $tasks = array();
  28. /**
  29. * 初始化任务
  30. * @return void
  31. */
  32. public static function init($event = null)
  33. {
  34. pcntl_alarm(1);
  35. if($event)
  36. {
  37. $event->add(SIGALRM, \WORKERMAN\Core\Events\BaseEvent::EV_SIGNAL, array('\WORKERMAN\Core\Lib\Task', 'signalHandle'));
  38. }
  39. else
  40. {
  41. pcntl_signal(SIGALRM, array('\WORKERMAN\Core\Lib\Task', 'signalHandle'), false);
  42. }
  43. }
  44. /**
  45. * 捕捉alarm信号
  46. * @return void
  47. */
  48. public static function signalHandle()
  49. {
  50. self::tick();
  51. pcntl_alarm(1);
  52. }
  53. /**
  54. *
  55. * 添加一个任务
  56. *
  57. * @param int $time_long 多长时间运行一次 单位秒
  58. * @param callback $func 任务运行的函数或方法
  59. * @param mix $args 任务运行的函数或方法使用的参数
  60. * @return void
  61. */
  62. public static function add($time_long, $func, $args = array(), $persistent = true)
  63. {
  64. if($time_long <= 0)
  65. {
  66. return false;
  67. }
  68. if(!is_callable($func) && class_exists('Log'))
  69. {
  70. \WORKERMAN\Core\Lib\Log::add(var_export($func, true). "not callable\n");
  71. return false;
  72. }
  73. $time_now = time();
  74. $run_time = $time_now + $time_long;
  75. if(!isset(self::$tasks[$run_time]))
  76. {
  77. self::$tasks[$run_time] = array();
  78. }
  79. self::$tasks[$run_time][] = array($func, $args, $persistent, $time_long);
  80. return true;
  81. }
  82. /**
  83. *
  84. * 定时被调用,用于触发定时任务
  85. *
  86. * @return void
  87. */
  88. public static function tick()
  89. {
  90. if(empty(self::$tasks))
  91. {
  92. return;
  93. }
  94. $time_now = time();
  95. foreach (self::$tasks as $run_time=>$task_data)
  96. {
  97. // 时间到了就运行一下
  98. if($time_now >= $run_time)
  99. {
  100. foreach($task_data as $index=>$one_task)
  101. {
  102. $task_func = $one_task[0];
  103. $task_args = $one_task[1];
  104. $persistent = $one_task[2];
  105. $time_long = $one_task[3];
  106. call_user_func_array($task_func, $task_args);
  107. // 持久的放入下一个任务队列
  108. if($persistent)
  109. {
  110. self::add($time_long, $task_func, $task_args);
  111. }
  112. }
  113. unset(self::$tasks[$run_time]);
  114. }
  115. }
  116. }
  117. /**
  118. * 删除所有的任务
  119. */
  120. public static function delAll()
  121. {
  122. self::$tasks = array();
  123. }
  124. }