8.5.x core.api.php hook_cron()
8.0.x core.api.php hook_cron()
8.1.x core.api.php hook_cron()
8.2.x core.api.php hook_cron()
8.3.x core.api.php hook_cron()
8.4.x core.api.php hook_cron()
8.6.x core.api.php hook_cron()
4.6.x core.php hook_cron()
4.7.x core.php hook_cron()
5.x core.php hook_cron()
6.x core.php hook_cron()
7.x system.api.php hook_cron()

Perform periodic actions.

Modules that require some commands to be executed periodically can implement hook_cron(). The engine will then call the hook whenever a cron run happens, as defined by the administrator. Typical tasks managed by hook_cron() are database maintenance, backups, recalculation of settings or parameters, automated mailing, and retrieving remote data.

Short-running or non-resource-intensive tasks can be executed directly in the hook_cron() implementation.

Long-running tasks and tasks that could time out, such as retrieving remote data, sending email, and intensive file tasks, should use the queue API instead of executing the tasks directly. To do this, first define one or more queues via a \Drupal\Core\Annotation\QueueWorker plugin. Then, add items that need to be processed to the defined queues.

Related topics

15 functions implement hook_cron()

Note: this list is generated by pattern matching, so it may include some functions that are not actually implementations of this hook.

aggregator_cron in core/modules/aggregator/aggregator.module
Implements hook_cron().
comment_cron in core/modules/comment/comment.module
Implements hook_cron().
common_test_cron in core/modules/system/tests/modules/common_test/common_test.module
Implements hook_cron().
common_test_cron_helper_cron in core/modules/system/tests/modules/common_test_cron_helper/common_test_cron_helper.module
Implements hook_cron().
dblog_cron in core/modules/dblog/dblog.module
Implements hook_cron().

... See full list


core/core.api.php, line 1945
Documentation landing page and topics, plus core library hooks.


function hook_cron() {

  // Short-running operation example, not using a queue:
  // Delete all expired records since the last cron run.
  $expires = \Drupal::state()
    ->get('mymodule.last_check', 0);
    ->condition('expires', $expires, '>=')
    ->set('mymodule.last_check', REQUEST_TIME);

  // Long-running operation example, leveraging a queue:
  // Queue news feeds for updates once their refresh interval has elapsed.
  $queue = \Drupal::queue('aggregator_feeds');
  $ids = \Drupal::entityManager()
  foreach (Feed::loadMultiple($ids) as $feed) {
    if ($queue
      ->createItem($feed)) {

      // Add timestamp to avoid queueing item more than once.
  $ids = \Drupal::entityQuery('aggregator_feed')
    ->condition('queued', REQUEST_TIME - 3600 * 6, '<')
  if ($ids) {
    $feeds = Feed::loadMultiple($ids);
    foreach ($feeds as $feed) {


HasinaNjaratin’s picture

ultimate_cron is a solution to view cron task list in Drupal 8

jmsosso’s picture

If your site is configured to run cron with drush, so you don't have problems with connection timeout, and you want to run large processes you must refresh the cron expiry time to avoid the lock to be breaked in 15 minutes.

In your loop you should call:

        $lock = Drupal::lock();
        if (!$lock->acquire('cron', 900.0)) {
          $this->logger->warning('Cannot extend the cron lock expiration');