manager.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. namespace task;
  3. use Exception;
  4. use trans_wapper;
  5. class manager
  6. {
  7. private $mHandler;
  8. public function __construct()
  9. {
  10. $this->mHandler = new handler();
  11. }
  12. public function add_task($method, $params, $is_show = 1, $del_timeout = -1, $title = '', $mchid = 0)
  13. {
  14. if(empty($method) || empty($params)) {
  15. return false;
  16. }
  17. //task 唯一性
  18. $hash_fun = function ($method,$params) {
  19. $val = $method . '-' . serialize($params);
  20. return md5($val);
  21. };
  22. $task_hash = $hash_fun($method,$params);
  23. if(empty($title)) {
  24. $title_fun = "{$method}_title";
  25. $title = $this->mHandler->$title_fun($params);
  26. }
  27. $mod_task = Model('task');
  28. $item = $mod_task->getByHash($task_hash);
  29. if(!empty($item) && $del_timeout > 0)
  30. {
  31. if(time() - $item['add_time'] > $del_timeout) {
  32. $mod_task->where(['task_id' => $item['task_id']])->delete();
  33. $item = [];
  34. }
  35. }
  36. if(empty($item))
  37. {
  38. $item = ['type' => $method, 'title' => $title,
  39. 'params' => serialize($params), 'task_hash' => $task_hash,
  40. 'add_time' => time(), 'is_show' => $is_show, 'mchid' => $mchid];
  41. $task_id = $mod_task->insert($item);
  42. $item = $mod_task->where(['task_id' => $task_id])->master(true)->find();
  43. }
  44. return task_wrapper::CreateTask($item);
  45. }
  46. //弹出一个任务,并且将任务设为进行中
  47. public function pop_task($task_id)
  48. {
  49. $mod_task = Model('task');
  50. $trans = new trans_wapper($mod_task,'pop_task');
  51. try {
  52. $item = $mod_task->field('*')
  53. ->where(['task_id' => ['gt',$task_id],'state' => task_wrapper::Waiting])
  54. ->master(true)->lock(true)->find();
  55. if(!empty($item)) {
  56. $mod_task->where(['task_id' => $item['task_id']])->update(['state' => task_wrapper::Processing,'act_time' => time()]);
  57. }
  58. $trans->commit();
  59. return $item;
  60. }
  61. catch (Exception $ex)
  62. {
  63. $trans->rollback();
  64. return [];
  65. }
  66. }
  67. //任务结束,并且
  68. public function fini_task($task_id,$succ)
  69. {
  70. }
  71. public function del_task()
  72. {
  73. }
  74. public function getResult($task)
  75. {
  76. }
  77. public function handle($task)
  78. {
  79. $method = $task['type'];
  80. $params = unserialize($task['params']);
  81. $handler = new handler();
  82. [$succ,$result] = $handler->$method($params);
  83. $mod_task = Model('task');
  84. if(!empty($result))
  85. {
  86. $mod_task->where(['task_id' => $task['task_id']])->update(['state' => task_wrapper::Handled,
  87. 'result_state' => $succ ? 1 : 0, 'result' => serialize($result),
  88. 'finish_time' => time()]);
  89. }
  90. return $task['task_id'];
  91. }
  92. }