Task.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | saiadmin [ saiadmin快速开发框架 ]
  4. // +----------------------------------------------------------------------
  5. // | Author: sai <1430792918@qq.com>
  6. // +----------------------------------------------------------------------
  7. namespace plugin\saiadmin\process;
  8. use plugin\saiadmin\app\logic\tool\CrontabLogic;
  9. use Webman\Channel\Client;
  10. use Workerman\Crontab\Crontab;
  11. class Task
  12. {
  13. protected $logic; //login对象
  14. public $crontabIds = []; //定时任务表主键id => Crontab对象id
  15. public function __construct()
  16. {
  17. $dbName = env('DB_NAME');
  18. if (!empty($dbName)) {
  19. $this->logic = new CrontabLogic();
  20. // 连接webman channel服务
  21. Client::connect();
  22. // 订阅某个自定义事件并注册回调,收到事件后会自动触发此回调
  23. Client::on('crontab', function ($data) {
  24. $this->reload($data);
  25. });
  26. }
  27. }
  28. public function onWorkerStart()
  29. {
  30. $dbName = env('DB_NAME');
  31. if (!empty($dbName)) {
  32. $this->initStart();
  33. }
  34. }
  35. public function initStart()
  36. {
  37. $logic = new CrontabLogic();
  38. $taskList = $logic->getAll($logic->search(['status' => 1]));
  39. foreach ($taskList as $item) {
  40. $crontab = new Crontab($item['rule'], function () use ($item) {
  41. $this->logic->run($item['id']);
  42. });
  43. $this->crontabIds[intval($item['id'])] = $crontab->getId(); //存储定时任务表主键id => Crontab对象id
  44. echo PHP_EOL . date('Y-m-d H:i:s') . " => 定时任务[" . $item['id'] . "][" . $item['name'] . "]:启动成功" . PHP_EOL;
  45. }
  46. }
  47. public function reload($data)
  48. {
  49. $id = intval($data['args'] ?? 0); //定时任务表主键id
  50. if (isset($this->crontabIds[$id])) {
  51. Crontab::remove($this->crontabIds[$id]);
  52. unset($this->crontabIds[$id]); //删除定时任务表主键id => Crontab对象id
  53. echo PHP_EOL . date('Y-m-d H:i:s') . " => 定时任务[" . $id . "]:移除成功" . PHP_EOL;
  54. }
  55. $item = $this->logic->read($id);// 查询定时任务表数据
  56. if ($item && $item['status'] == 1) {
  57. $crontab = new Crontab($item['rule'], function () use ($item) {
  58. $this->logic->run($item['id']);
  59. });
  60. $this->crontabIds[$id] = $crontab->getId(); //存储定时任务表主键id => Crontab对象id
  61. echo PHP_EOL . date('Y-m-d H:i:s') . " => 定时任务[" . $item['id'] . "][" . $item['name'] . "]:启动成功" . PHP_EOL;
  62. }
  63. }
  64. }