Нет описания

InactiveSubscribers.php 2.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <?php
  2. namespace MailPoet\Cron\Workers;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Models\ScheduledTask;
  5. use MailPoet\Models\Subscriber;
  6. use MailPoet\Settings\SettingsController;
  7. use MailPoet\Subscribers\InactiveSubscribersController;
  8. class InactiveSubscribers extends SimpleWorker {
  9. const TASK_TYPE = 'inactive_subscribers';
  10. const BATCH_SIZE = 1000;
  11. const SUPPORT_MULTIPLE_INSTANCES = false;
  12. /** @var InactiveSubscribersController */
  13. private $inactiveSubscribersController;
  14. /** @var SettingsController */
  15. private $settings;
  16. public function __construct(
  17. InactiveSubscribersController $inactiveSubscribersController,
  18. SettingsController $settings
  19. ) {
  20. $this->inactiveSubscribersController = $inactiveSubscribersController;
  21. $this->settings = $settings;
  22. parent::__construct();
  23. }
  24. public function processTaskStrategy(ScheduledTask $task, $timer) {
  25. $trackingEnabled = (bool)$this->settings->get('tracking.enabled');
  26. if (!$trackingEnabled) {
  27. $this->schedule();
  28. return true;
  29. }
  30. $daysToInactive = (int)$this->settings->get('deactivate_subscriber_after_inactive_days');
  31. // Activate all inactive subscribers in case the feature is turned off
  32. if ($daysToInactive === 0) {
  33. $this->inactiveSubscribersController->reactivateInactiveSubscribers();
  34. $this->schedule();
  35. return true;
  36. }
  37. // Handle activation/deactivation within interval
  38. $meta = $task->getMeta();
  39. $lastSubscriberId = isset($meta['last_subscriber_id']) ? $meta['last_subscriber_id'] : 0;
  40. $maxSubscriberId = isset($meta['max_subscriber_id']) ? $meta['max_subscriber_id'] : (int)Subscriber::max('id');
  41. while ($lastSubscriberId <= $maxSubscriberId) {
  42. $count = $this->inactiveSubscribersController->markInactiveSubscribers($daysToInactive, self::BATCH_SIZE, $lastSubscriberId);
  43. if ($count === false) {
  44. break;
  45. }
  46. $lastSubscriberId += self::BATCH_SIZE;
  47. $task->meta = ['last_subscriber_id' => $lastSubscriberId];
  48. $task->save();
  49. $this->cronHelper->enforceExecutionLimit($timer);
  50. };
  51. while ($this->inactiveSubscribersController->markActiveSubscribers($daysToInactive, self::BATCH_SIZE) === self::BATCH_SIZE) {
  52. $this->cronHelper->enforceExecutionLimit($timer);
  53. };
  54. $this->schedule();
  55. return true;
  56. }
  57. }