TaskAbstract.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. <?php
  2. namespace MGModule\DNSManager2\mgLibs\custom\task;
  3. use MGModule\DNSManager2\mgLibs\custom\manager\LogHelper;
  4. use MGModule\DNSManager2\models\custom\task;
  5. use MGModule\DNSManager2\mgLibs\custom\TaskManager;
  6. use MGModule\DNSManager2\mgLibs\custom\helpers\TimeDiffHelper;
  7. abstract class TaskAbstract
  8. {
  9. /** @var \MGModule\DNSManager2\models\custom\task\Task */
  10. protected $task;
  11. /** @var TaskAbstract */
  12. protected $parent;
  13. private $method;
  14. protected $abort_after_repeats = array();
  15. protected $force = false;
  16. protected $taskTypeCode;
  17. public function mainDescription()
  18. {
  19. return 'Task';
  20. }
  21. public function __construct($task, $method, $parent = false) {
  22. $this->method = $method;
  23. $this->task = $task;
  24. if($parent !== false) {
  25. $this->parent = $parent;
  26. }
  27. if($this->task->parentid && $parent === false) {
  28. $this->parent = TaskManager::getTaskObjectByID($this->task->parentid);
  29. }
  30. }
  31. public function description() {
  32. $method = $this->method . 'Description';
  33. try {
  34. $desc = method_exists($this, $method)?$this->$method():$this->task->name;
  35. } catch (\Exception $e) {
  36. $desc = $this->task->name;
  37. }
  38. return $desc;
  39. }
  40. public function run($force = false) {
  41. $this->force = $force;
  42. // if(in_array($this->task->status, array(task\TaskStatusEnum::ABORTED, task\TaskStatusEnum::CANCELED, task\TaskStatusEnum::FINISHED, task\TaskStatusEnum::ERROR)))
  43. // return ;
  44. $after = !isset($this->abort_after_repeats[$this->method])?3:$this->abort_after_repeats[$this->method];
  45. if($this->task->repeats + 1 > $after && $after != 0) {
  46. $this->setStatus(task\TaskStatusEnum::ABORTED);
  47. return ;
  48. }
  49. try { //TODO: tutaj albo w cronie pomyśleć
  50. $ret = $this->{$this->method}($this->task->params);
  51. if($ret !== true) {
  52. $this->task->lastrun = date('Y-m-d H:i:s');
  53. $this->task->repeats++;
  54. $this->task->save();
  55. }
  56. } catch (\Exception $e) {
  57. $this->setStatus(task\TaskStatusEnum::ERROR);
  58. $this->addResult(array('error' => $e->getMessage()));
  59. LogHelper::addFailLog($this->mainDescription(), $e->getMessage());
  60. }
  61. }
  62. public function runAfter($minutes = 0, $hours = 0, $days = 0) {
  63. $this->task->nextrun = date('Y-m-d H:i:s', strtotime("+$minutes minutes $hours hours $days days "));
  64. $this->task->save();
  65. }
  66. protected function diffFromLastRun() {
  67. return TimeDiffHelper::diff($this->task->lastrun?:'1969-07-20');
  68. }
  69. public function getStatus() {
  70. return $this->task->status;
  71. }
  72. protected function setStatus($status) {
  73. $this->task->status = $status;
  74. $this->task->save();
  75. }
  76. public function setFinishedStatusOnCronRun( $taskname, $cronLimit )
  77. {
  78. $allStartChildsCount = $this->getChildsCount($taskname, task\TaskStatusEnum::START);
  79. $allChildsCount = $this->getChildsCount($taskname);
  80. if( $allChildsCount > 0 && $allStartChildsCount < $cronLimit)
  81. {
  82. $this->setStatus(task\TaskStatusEnum::FINISHED);
  83. }
  84. }
  85. public function getParams($key = false) {
  86. return $key===false?$this->task->params:$this->task->params[$key];
  87. }
  88. /** @return TaskAbstract */
  89. public function getParent() {
  90. return $this->parent;
  91. }
  92. /** @return TaskAbstract */
  93. public function addChild($name, $params = array(), $clientId = false) {
  94. $name = $this->parseName($name);
  95. return TaskManager::getTaskObject(TaskManager::addTask($name, $params, $this->task->id, $clientId), $this);
  96. }
  97. public function getChilds() {
  98. return TaskManager::getXTasksObjects(0, false, $this->task->id, false);
  99. }
  100. public function getXChilds($x, $name = false, $status = task\TaskStatusEnum::IN_PROGRESS) {
  101. $out = array();
  102. foreach(TaskManager::getXTasks($x, $this->parseName($name), $this->task->id, $status) as $task)
  103. $out[] = TaskManager::getTaskObject($task, $this);
  104. return $out;
  105. }
  106. public function getChildsCount( $name = false, $status = false )
  107. {
  108. return TaskManager::countTasks($this->parseName($name), $this->task->id, $status);
  109. }
  110. final protected function parseName($name) {
  111. $class = get_class($this);
  112. if ($pos = strrpos($class, '\\'))
  113. $class = substr($class, $pos + 1);
  114. return $name!==false?$class . ':' . $name:false;
  115. }
  116. protected function addResult(array $data = array()) {
  117. TaskManager::addTaskResult($this->task->id, $data);
  118. }
  119. public function getResults($first = false) {
  120. $results = TaskManager::getTaskResults($this->task->id);
  121. return $first === false?$results:array_pop($results);
  122. }
  123. public function remove() {
  124. foreach($this->getChilds() as $child)
  125. $child->remove();
  126. foreach($this->getResults() as $result)
  127. $result->delete();
  128. $this->task->delete();
  129. }
  130. public function obj() {
  131. return $this->task;
  132. }
  133. public function isInCliMode()
  134. {
  135. $allowedModes = array('cli', 'cgi-fcgi');
  136. if(in_array(php_sapi_name(), $allowedModes))
  137. {
  138. return true;
  139. }
  140. return false;
  141. }
  142. public function getTaskTypeCode()
  143. {
  144. return $this->taskTypeCode;
  145. }
  146. public function isReadyToRun( $period )
  147. {
  148. if(($this->diffFromLastRun()->minutes < $period || $period == 0) && !$this->force)
  149. {
  150. return false;
  151. }
  152. return true;
  153. }
  154. }