Task.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?php
  2. /**
  3. * Created by PhpStorm
  4. * User Julyssn
  5. * Date 2022/12/14 17:24
  6. */
  7. namespace app\manage\controller;
  8. use app\BaseController;
  9. use easyTask\Terminal;
  10. use think\App;
  11. use think\facade\Console;
  12. use think\Response;
  13. class Task extends BaseController
  14. {
  15. /**
  16. * 项目根目录
  17. * @var string
  18. */
  19. protected $rootPath;
  20. protected $taskNames = [];
  21. public function __construct(App $app)
  22. {
  23. parent::__construct($app);
  24. $this->rootPath = root_path();
  25. chdir($this->rootPath);
  26. $this->taskNames = [
  27. 'schedule' => lang('task.schedule'),
  28. 'queue' => lang('task.queue'),
  29. 'worker' => lang('task.worker'),
  30. 'clearStd' => lang('task.clearStd'),
  31. 'userQueue' => lang('task.userQueue'),
  32. ];
  33. }
  34. /**
  35. * 任务列表
  36. * @return Response
  37. */
  38. public function getTaskList()
  39. {
  40. $data = $this->taskMsg();
  41. if (!count($data)) {
  42. return warning('');
  43. }
  44. foreach ($data as &$datum) {
  45. $expName = explode('_', $datum['name']);
  46. $datum['remark'] = $this->taskNames[$expName[count($expName) - 1]] ?? lang('task.null');
  47. }
  48. unset($datum);
  49. return success('', $data);
  50. }
  51. /**
  52. * 启动全部进程
  53. * @return Response
  54. */
  55. public function startTask()
  56. {
  57. if(strpos(strtolower(PHP_OS), 'win') === 0)
  58. {
  59. return warning(lang('task.winRun'));
  60. }
  61. if (count($this->taskMsg())) {
  62. return warning(lang('task.alreadyRun'));
  63. }
  64. // 启动
  65. $out = Terminal::instance(2)->exec('php think task start');
  66. if (!count($this->analysisMsg($out))) {
  67. return warning(lang('task.startFail'));
  68. }
  69. return success(lang('task.startOk'));
  70. }
  71. /**
  72. * 强制停止全部进程
  73. * @return Response
  74. */
  75. public function stopTask()
  76. {
  77. if (!count($this->taskMsg())) {
  78. return warning(lang('task.notRun'));
  79. }
  80. // 强制停止
  81. Terminal::instance(2)->exec('php think task stop force');
  82. return success('');
  83. }
  84. /**
  85. * 获取单个任务日志
  86. * @return Response
  87. */
  88. public function getTaskLog()
  89. {
  90. $name = $this->request->param('name');
  91. $path = $this->rootPath . 'runtime' . DIRECTORY_SEPARATOR . 'easy_task' . DIRECTORY_SEPARATOR . 'Std' . DIRECTORY_SEPARATOR;
  92. if (!file_exists($path . 'exec_' . $name . '.std')) {
  93. $expName = explode('_', $name);
  94. $name = $expName[count($expName) - 1];
  95. if (!file_exists($path . 'exec_' . $name . '.std')) {
  96. return warning(lang('task.logExist'));
  97. }
  98. }
  99. return success('', file_get_contents($path . 'exec_' . $name . '.std'));
  100. }
  101. /**
  102. * 清理单个任务日志
  103. * @return Response
  104. */
  105. public function clearTaskLog()
  106. {
  107. $name = $this->request->param('name');
  108. $path = $this->rootPath . 'runtime' . DIRECTORY_SEPARATOR . 'easy_task' . DIRECTORY_SEPARATOR . 'Std' . DIRECTORY_SEPARATOR;
  109. if (!file_exists($path . 'exec_' . $name . '.std')) {
  110. $expName = explode('_', $name);
  111. $name = $expName[count($expName) - 1];
  112. if (!file_exists($path . 'exec_' . $name . '.std')) {
  113. return warning(lang('task.logExist'));
  114. }
  115. }
  116. file_put_contents($path . 'exec_' . $name . '.std', '');
  117. return success('');
  118. }
  119. /**
  120. * 获取运行状态
  121. * @return array
  122. */
  123. private function taskMsg()
  124. {
  125. $out = Terminal::instance(2)->exec('php think task status');
  126. return $this->analysisMsg($out);
  127. }
  128. /**
  129. * 解析数据
  130. * @param string $out 带解析数据
  131. * @return array
  132. */
  133. private function analysisMsg(string $out)
  134. {
  135. $re = '/│ *([\w+]+) *│ *([\w+]+)[ ]*│ *([\w+]+|[0-9- :]+) *│ *([\w+]+) *│ *([\w+]+) *│ *([\w+]+) *│/m';
  136. preg_match_all($re, $out, $matches, PREG_SET_ORDER, 0);
  137. if (!count($matches)) {
  138. return [];
  139. }
  140. $data = [];
  141. $names = $matches[0];
  142. unset($names[0]);
  143. $names = array_values($names);
  144. unset($matches[0]);
  145. foreach ($matches as $match) {
  146. $temp = [];
  147. foreach ($match as $key => $item) {
  148. if ($key !== 0) {
  149. $temp[$names[$key - 1]] = $item;
  150. }
  151. }
  152. $data[] = $temp;
  153. }
  154. return $data;
  155. }
  156. }