Keine Beschreibung

CronWorkerScheduler.php 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <?php
  2. namespace MailPoet\Cron;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Entities\ScheduledTaskEntity;
  5. use MailPoet\Models\ScheduledTask;
  6. use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
  7. use MailPoet\WP\Functions as WPFunctions;
  8. use MailPoetVendor\Carbon\Carbon;
  9. class CronWorkerScheduler {
  10. /** @var WPFunctions */
  11. private $wp;
  12. /** @var ScheduledTasksRepository */
  13. private $scheduledTaskRepository;
  14. public function __construct(
  15. WPFunctions $wp,
  16. ScheduledTasksRepository $scheduledTaskRepository
  17. ) {
  18. $this->wp = $wp;
  19. $this->scheduledTaskRepository = $scheduledTaskRepository;
  20. }
  21. public function scheduleImmediatelyIfNotRunning($taskType, $priority = ScheduledTaskEntity::PRIORITY_LOW): ScheduledTaskEntity {
  22. $task = $this->scheduledTaskRepository->findScheduledOrRunningTask($taskType);
  23. // Do nothing when task is running
  24. if (($task instanceof ScheduledTaskEntity) && $task->getStatus() === null) {
  25. return $task;
  26. }
  27. $now = Carbon::createFromTimestamp($this->wp->currentTime('timestamp'));
  28. // Reschedule existing scheduled task
  29. if ($task instanceof ScheduledTaskEntity) {
  30. $task->setScheduledAt($now);
  31. $task->setPriority($priority);
  32. $this->scheduledTaskRepository->flush();
  33. }
  34. // Schedule new task
  35. return $this->schedule($taskType, $now, $priority);
  36. }
  37. public function schedule($taskType, $nextRunDate, $priority = ScheduledTaskEntity::PRIORITY_LOW): ScheduledTaskEntity {
  38. $alreadyScheduled = $this->scheduledTaskRepository->findScheduledTask($taskType);
  39. if ($alreadyScheduled) {
  40. return $alreadyScheduled;
  41. }
  42. $task = new ScheduledTaskEntity();
  43. $task->setType($taskType);
  44. $task->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED);
  45. $task->setPriority($priority);
  46. $task->setScheduledAt($nextRunDate);
  47. $this->scheduledTaskRepository->persist($task);
  48. $this->scheduledTaskRepository->flush();
  49. return $task;
  50. }
  51. public function reschedule(ScheduledTask $task, $timeout) {
  52. $scheduledAt = Carbon::createFromTimestamp($this->wp->currentTime('timestamp'));
  53. $task->scheduledAt = $scheduledAt->addMinutes($timeout);
  54. $task->setExpr('updated_at', 'NOW()');
  55. $task->status = ScheduledTask::STATUS_SCHEDULED;
  56. $task->save();
  57. }
  58. }