You are here

class Crontab in Ultimate Cron 8.2

Crontab scheduler.

Plugin annotation


@SchedulerPlugin(
  id = "crontab",
  title = @Translation("Crontab"),
  description = @Translation("Use crontab rules for scheduling jobs."),
)

Hierarchy

Expanded class hierarchy of Crontab

2 files declare their use of Crontab
RulesUnitTest.php in tests/src/Unit/RulesUnitTest.php
SchedulerPluginTest.php in tests/src/Kernel/SchedulerPluginTest.php
2 string references to 'Crontab'
SchedulerSettingsForm::buildForm in src/Form/SchedulerSettingsForm.php
Form constructor.
ultimate_cron.schema.yml in config/schema/ultimate_cron.schema.yml
config/schema/ultimate_cron.schema.yml

File

src/Plugin/ultimate_cron/Scheduler/Crontab.php, line 19

Namespace

Drupal\ultimate_cron\Plugin\ultimate_cron\Scheduler
View source
class Crontab extends SchedulerBase {

  /**
   * Default settings.
   * @todo: $catch_up is randomly failing when value is low in some situation. 0 value is ignoring catch_up checks.
   */
  public function defaultConfiguration() {
    return array(
      'rules' => array(
        '0+@ */3 * * *',
      ),
      'catch_up' => '0',
    );
  }

  /**
   * {@inheritdoc}
   */
  public function formatLabel(CronJob $job) {
    return implode("\n", $this->configuration['rules']);
  }

  /**
   * {@inheritdoc}
   */
  public function formatLabelVerbose(CronJob $job) {
    $parsed = '';
    $next_schedule = NULL;
    $time = REQUEST_TIME;
    $skew = $this
      ->getSkew($job);
    foreach ($this->configuration['rules'] as $rule) {
      $cron = CronRule::factory($rule, $time, $skew);
      $parsed .= $cron
        ->parseRule() . "\n";
      $result = $cron
        ->getNextSchedule();
      $next_schedule = is_null($next_schedule) || $next_schedule > $result ? $result : $next_schedule;
      $result = $cron
        ->getLastSchedule();
      if ($time < $result + $this->configuration['catch_up']) {
        $result = floor($time / 60) * 60 + 60;
        $next_schedule = $next_schedule > $result ? $result : $next_schedule;
      }
    }
    $parsed .= t('Next scheduled run at @datetime', array(
      '@datetime' => \Drupal::service('date.formatter')
        ->format($next_schedule, 'custom', 'Y-m-d H:i:s'),
    ));
    return $parsed;
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form['rules'][0] = array(
      '#title' => t("Rules"),
      '#type' => 'textfield',
      '#default_value' => $this->configuration['rules'],
      '#description' => t('Comma separated list of crontab rules.'),
      '#fallback' => TRUE,
      '#required' => TRUE,
    );
    $form['rules_help'] = array(
      '#type' => 'fieldset',
      '#title' => t('Rules help'),
      '#collapsible' => TRUE,
      '#collapsed' => TRUE,
    );
    $form['rules_help']['info'] = array(
      '#markup' => file_get_contents(drupal_get_path('module', 'ultimate_cron') . '/help/rules.html'),
    );
    $form['catch_up'] = array(
      '#title' => t("Catch up"),
      '#type' => 'textfield',
      '#default_value' => $this->configuration['catch_up'],
      '#description' => t("Don't run job after X seconds of rule."),
      '#fallback' => TRUE,
      '#required' => TRUE,
    );
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
    parent::validateConfigurationForm($form, $form_state);
    $rule = $form_state
      ->getValues()['scheduler']['configuration']['rules'][0];
    $cron = CronRule::factory($rule);
    if (!$cron
      ->isValid()) {
      $form_state
        ->setErrorByName('scheduler][configuration][rules][0', t('Rule is invalid'));
    }
  }

  /**
   * {@inheritdoc}
   */
  public function settingsFormSubmit(&$form, &$form_state, CronJob $job = NULL) {
    $values =& $form_state['values']['settings'][$this->type][$this->name];
    if (!empty($values['rules'])) {
      $rules = explode(',', $values['rules']);
      $values['rules'] = array_map('trim', $rules);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function isScheduled(CronJob $job) {
    $log_entry = isset($job->log_entry) ? $job->log_entry : $job
      ->loadLatestLogEntry();
    $skew = $this
      ->getSkew($job);
    $class = get_class($this);
    return $class::shouldRun($this->configuration['rules'], $log_entry->start_time, NULL, $this->configuration['catch_up'], $skew) ? TRUE : FALSE;
  }

  /**
   * {@inheritdoc}
   */
  public static function shouldRun($rules, $job_last_ran, $time = NULL, $catch_up = 0, $skew = 0) {
    $time = is_null($time) ? time() : $time;
    foreach ($rules as $rule) {
      $cron = CronRule::factory($rule, $time, $skew);
      $cron_last_ran = $cron
        ->getLastSchedule();

      // @todo: Right now second test is failing randomly on low $catch_up value.
      if ($job_last_ran < $cron_last_ran && $cron_last_ran <= $time) {
        if ($time <= $cron_last_ran + $catch_up || $catch_up == 0) {
          return $time - $job_last_ran;
        }
      }
    }
    return FALSE;
  }

  /**
   * {@inheritdoc}
   */
  public function isBehind(CronJob $job) {

    // Disabled jobs are not behind!
    if (!$job
      ->status()) {
      return FALSE;
    }
    $log_entry = isset($job->log_entry) ? $job->log_entry : $job
      ->loadLatestLogEntry();

    // If job hasn't run yet, then who are we to say it's behind its schedule?
    // Check the registered time, and use that if it's available.
    $job_last_ran = $log_entry->start_time;
    if (!$job_last_ran) {
      $registered = \Drupal::config('ultimate_cron')
        ->get('ultimate_cron_hooks_registered');
      if (empty($registered[$job
        ->id()])) {
        return FALSE;
      }
      $job_last_ran = $registered[$job
        ->id()];
    }
    $skew = $this
      ->getSkew($job);
    $next_schedule = NULL;
    foreach ($this->configuration['rules'] as $rule) {
      $cron = CronRule::factory($rule, $job_last_ran, $skew);
      $time = $cron
        ->getNextSchedule();
      $next_schedule = is_null($next_schedule) || $time < $next_schedule ? $time : $next_schedule;
    }
    $behind = REQUEST_TIME - $next_schedule;
    return $behind > $this->configuration['catch_up'] ? $behind : FALSE;
  }

  /**
   * Get a "unique" skew for a job.
   */
  protected function getSkew(CronJob $job) {
    return $job
      ->getUniqueID() & 0xff;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
CronPlugin::$globalOptions public static property
CronPlugin::$instances public static property
CronPlugin::$multiple public static property 1
CronPlugin::$weight public property
CronPlugin::calculateDependencies public function Calculates dependencies for the configured plugin. Overrides DependentPluginInterface::calculateDependencies
CronPlugin::cleanForm public function Clean form of empty fallback values.
CronPlugin::drupal_array_remove_nested_value public function Modified version drupal_array_get_nested_value().
CronPlugin::fallbackalize public function Process fallback form parameters.
CronPlugin::getConfiguration public function Gets this plugin's configuration. Overrides ConfigurableInterface::getConfiguration
CronPlugin::getGlobalOption public static function Get global plugin option.
CronPlugin::getGlobalOptions public static function Get all global plugin options.
CronPlugin::getPluginTypes public static function Returns a list of plugin types.
CronPlugin::isValid public function Default plugin valid for all jobs. 1
CronPlugin::setConfiguration public function Sets the configuration for this plugin instance. Overrides ConfigurableInterface::setConfiguration
CronPlugin::setGlobalOption public static function Set global plugin option.
CronPlugin::settingsLabel public function Get label for a specific setting. 1
CronPlugin::submitConfigurationForm public function Form submission handler. Overrides PluginFormInterface::submitConfigurationForm
CronPlugin::__construct public function Constructs a \Drupal\Component\Plugin\PluginBase object. Overrides PluginBase::__construct 2
Crontab::buildConfigurationForm public function Form constructor. Overrides CronPlugin::buildConfigurationForm 1
Crontab::defaultConfiguration public function Default settings. @todo: $catch_up is randomly failing when value is low in some situation. 0 value is ignoring catch_up checks. Overrides CronPlugin::defaultConfiguration 1
Crontab::formatLabel public function Label for schedule. Overrides SchedulerInterface::formatLabel 1
Crontab::formatLabelVerbose public function Label for schedule. Overrides SchedulerInterface::formatLabelVerbose
Crontab::getSkew protected function Get a "unique" skew for a job.
Crontab::isBehind public function Check if job is behind schedule. Overrides SchedulerBase::isBehind
Crontab::isScheduled public function Check job schedule. Overrides SchedulerBase::isScheduled
Crontab::settingsFormSubmit public function
Crontab::shouldRun public static function
Crontab::validateConfigurationForm public function Form validation handler. Overrides CronPlugin::validateConfigurationForm
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.