Task.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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. ];
  32. }
  33. /**
  34. * 任务列表
  35. * @return Response
  36. */
  37. public function getTaskList()
  38. {
  39. $data = $this->taskMsg();
  40. if (!count($data)) {
  41. return warning('');
  42. }
  43. foreach ($data as &$datum) {
  44. $expName = explode('_', $datum['name']);
  45. $datum['remark'] = $this->taskNames[$expName[count($expName) - 1]] ?? lang('task.null');
  46. }
  47. unset($datum);
  48. return success('', $data);
  49. }
  50. /**
  51. * 启动全部进程
  52. * @return Response
  53. */
  54. public function startTask()
  55. {
  56. if(strpos(strtolower(PHP_OS), 'win') === 0)
  57. {
  58. return warning(lang('task.winRun'));
  59. }
  60. if (count($this->taskMsg())) {
  61. return warning(lang('task.alreadyRun'));
  62. }
  63. // 启动
  64. $out = Terminal::instance(2)->exec('php think task start');
  65. if (!count($this->analysisMsg($out))) {
  66. return warning(lang('task.startFail'));
  67. }
  68. return success(lang('task.startOk'));
  69. }
  70. /**
  71. * 强制停止全部进程
  72. * @return Response
  73. */
  74. public function stopTask()
  75. {
  76. if (!count($this->taskMsg())) {
  77. return warning(lang('task.notRun'));
  78. }
  79. // 强制停止
  80. Terminal::instance(2)->exec('php think task stop force');
  81. return success('');
  82. }
  83. /**
  84. * 获取单个任务日志
  85. * @return Response
  86. */
  87. public function getTaskLog()
  88. {
  89. $name = $this->request->param('name');
  90. $path = $this->rootPath . 'runtime' . DIRECTORY_SEPARATOR . 'easy_task' . DIRECTORY_SEPARATOR . 'Std' . DIRECTORY_SEPARATOR;
  91. if (!file_exists($path . 'exec_' . $name . '.std')) {
  92. $expName = explode('_', $name);
  93. $name = $expName[count($expName) - 1];
  94. if (!file_exists($path . 'exec_' . $name . '.std')) {
  95. return warning(lang('task.logExist'));
  96. }
  97. }
  98. return success('', file_get_contents($path . 'exec_' . $name . '.std'));
  99. }
  100. /**
  101. * 清理单个任务日志
  102. * @return Response
  103. */
  104. public function clearTaskLog()
  105. {
  106. $name = $this->request->param('name');
  107. $path = $this->rootPath . 'runtime' . DIRECTORY_SEPARATOR . 'easy_task' . DIRECTORY_SEPARATOR . 'Std' . DIRECTORY_SEPARATOR;
  108. if (!file_exists($path . 'exec_' . $name . '.std')) {
  109. $expName = explode('_', $name);
  110. $name = $expName[count($expName) - 1];
  111. if (!file_exists($path . 'exec_' . $name . '.std')) {
  112. return warning(lang('task.logExist'));
  113. }
  114. }
  115. file_put_contents($path . 'exec_' . $name . '.std', '');
  116. return success('');
  117. }
  118. /**
  119. * 获取运行状态
  120. * @return array
  121. */
  122. private function taskMsg()
  123. {
  124. $out = Terminal::instance(2)->exec('php think task status');
  125. return $this->analysisMsg($out);
  126. }
  127. /**
  128. * 解析数据
  129. * @param string $out 带解析数据
  130. * @return array
  131. */
  132. private function analysisMsg(string $out)
  133. {
  134. $re = '/│ *([\w+]+) *│ *([\w+]+)[ ]*│ *([\w+]+|[0-9- :]+) *│ *([\w+]+) *│ *([\w+]+) *│ *([\w+]+) *│/m';
  135. preg_match_all($re, $out, $matches, PREG_SET_ORDER, 0);
  136. if (!count($matches)) {
  137. return [];
  138. }
  139. $data = [];
  140. $names = $matches[0];
  141. unset($names[0]);
  142. $names = array_values($names);
  143. unset($matches[0]);
  144. foreach ($matches as $match) {
  145. $temp = [];
  146. foreach ($match as $key => $item) {
  147. if ($key !== 0) {
  148. $temp[$names[$key - 1]] = $item;
  149. }
  150. }
  151. $data[] = $temp;
  152. }
  153. return $data;
  154. }
  155. }