CronHook.php

Namespace

Drupal\file\Hook

File

core/modules/file/src/Hook/CronHook.php

View source
<?php

declare (strict_types=1);
namespace Drupal\file\Hook;

use Drupal\Component\Datetime\TimeInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Hook\Attribute\Hook;
use Drupal\Core\StreamWrapper\StreamWrapperManagerInterface;
use Drupal\file\FileInterface;
use Drupal\file\FileUsage\FileUsageInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\Attribute\Autowire;

/**
 * Implements hook_cron().
 */
class CronHook {
    public function __construct(EntityTypeManagerInterface $entityTypeManager, StreamWrapperManagerInterface $streamWrapperManager, ConfigFactoryInterface $configFactory, FileUsageInterface $fileUsage, TimeInterface $time, LoggerInterface $logger) {
    }
    
    /**
     * Implements hook_cron().
     */
    public function __invoke() : void {
        $age = $this->configFactory
            ->get('system.file')
            ->get('temporary_maximum_age');
        $fileStorage = $this->entityTypeManager
            ->getStorage('file');
        // Only delete temporary files if older than $age. Note that automatic cleanup
        // is disabled if $age set to 0.
        if ($age) {
            $fids = $fileStorage->getQuery()
                ->accessCheck(FALSE)
                ->condition('status', FileInterface::STATUS_PERMANENT, '<>')
                ->condition('changed', $this->time
                ->getRequestTime() - $age, '<')
                ->range(0, 100)
                ->execute();
            
            /** @var \Drupal\file\FileInterface[] $files */
            $files = $fileStorage->loadMultiple($fids);
            foreach ($files as $file) {
                $references = $this->fileUsage
                    ->listUsage($file);
                if (empty($references)) {
                    if (!file_exists($file->getFileUri())) {
                        if (!$this->streamWrapperManager
                            ->isValidUri($file->getFileUri())) {
                            $this->logger
                                ->warning('Temporary file "%path" that was deleted during garbage collection did not exist on the filesystem. This could be caused by a missing stream wrapper.', [
                                '%path' => $file->getFileUri(),
                            ]);
                        }
                        else {
                            $this->logger
                                ->warning('Temporary file "%path" that was deleted during garbage collection did not exist on the filesystem.', [
                                '%path' => $file->getFileUri(),
                            ]);
                        }
                    }
                    // Delete the file entity. If the file does not exist, this will
                    // generate a second notice in the watchdog.
                    $file->delete();
                }
                else {
                    $this->logger
                        ->info('Did not delete temporary file "%path" during garbage collection because it is in use by the following modules: %modules.', [
                        '%path' => $file->getFileUri(),
                        '%modules' => implode(', ', array_keys($references)),
                    ]);
                }
            }
        }
    }

}

Classes

Title Deprecated Summary
CronHook Implements hook_cron().

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.