Task.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. namespace crmeb\services\async\task;
  3. use crmeb\utils\Beanstalk;
  4. use think\facade\Config;
  5. use think\facade\Log;
  6. /**
  7. * 这个 Task 表示异步任务的基类, 借助于 beanstalkd 等服务来异步执行或延后执行
  8. *
  9. * HOWTO
  10. *
  11. * 首先根据特定的任务,实现一个子类, 比如 SomeTask
  12. *
  13. * class SomeTask extends Task {
  14. * public static function push($param1, $param2, $param3) {
  15. * self::put([
  16. * 'param1' => $param1,
  17. * 'param2' => $param2,
  18. * 'param3' => $param3
  19. * ]);
  20. * }
  21. *
  22. * protected static function getCmd() {
  23. * return 'some_task';
  24. * }
  25. *
  26. * protected static function exec(array $param) {
  27. * //Do something
  28. * }
  29. * }
  30. *
  31. * // 消费任务的代码实现
  32. * // read from beanstalk
  33. * SomeTask::exec($param)
  34. *
  35. * 增加任务到 beanstalkd 代码
  36. */
  37. abstract class Task {
  38. /**
  39. * 虚函数。返回任务 cmd 标识, 任务类别
  40. *
  41. * @return string
  42. */
  43. abstract protected static function getCmd();
  44. /**
  45. * 虚函数。执行从 beanstalkd 中取出的任务数据 $task.
  46. *
  47. * @return boolean
  48. */
  49. abstract public static function exec(array $task);
  50. /**
  51. * 任务自由的数据都叫 params
  52. * 这个函数打包成任务数据
  53. * @return array
  54. */
  55. protected static function formatJob(array $params)
  56. {
  57. return [
  58. 'cmd' => static::getCmd(),
  59. 'ts' => time(),
  60. 'sender' => '0',
  61. 'params' => $params,
  62. ];
  63. }
  64. /**
  65. * 插入任务到 beanstalk
  66. *
  67. * @params 具体某个任务需要的参数
  68. * @return boolean
  69. */
  70. protected static function put(array $params)
  71. {
  72. $bean = Beanstalk::instance();
  73. $tube = Config::get('app.beanstalk_tube', 'twong');
  74. $arr = self::formatJob($params);
  75. $json = json_encode($arr);
  76. try {
  77. $bean::useTube($tube)->put($json);
  78. } catch (\Exception $e) {
  79. Log::error('beanstalk put failed: ' . $json . ' error:' . $e->getMessage());
  80. return false;
  81. }
  82. return true;
  83. }
  84. /**
  85. * job 格式基本检查
  86. *
  87. * @return boolean
  88. */
  89. protected static function checkTask($task)
  90. {
  91. if (!$task || !isset($task['cmd']) || $task['cmd'] != self::getCmd()) {
  92. Log::error('task format error: null or invalid cmd');
  93. return false;
  94. }
  95. if (!isset($task['params']) || !is_array($task['params'])) {
  96. Log::error('task format error: without params or not an array.');
  97. return false;
  98. }
  99. return true;
  100. }
  101. }