Создание самоочищающейся временной директории для файлов в laravel

Создаем папку, которая будет содержать временные файлы. Обычно это storage/app/temp (путь от корня приложения). Т.е. если проект находится по пути /var/www/laravel то полный путь до временной директории будет таким: /var/www/laravel/storage/app/temp.

Создаем диск

Сделаем необходимые настройки в config/filesystem.php. Нужно просто добавить этот код в disks:

'temp' => [
  'driver' => 'local',
  'root' => storage_path('app/temp'),
  'visibility' => 'private',
  'url' => '/storage/app/temp',
]

Теперь можно удобно работать с этим хранилищем через фасад Storage.

Storage::disk('temp') // получение инстанса диска

Подробнее о хранилище и о том, что можно с ним делать в доке на официальном сайте

Автоочистка временного хранилища

Чтобы не захламлять сервер временными файлами, временное хранилище нужно время от времени проверять и вычищать от скопившихся файлов. Но нельзя просто взять и единовременно удалить все файлы хранилища. А что если в момент очистки выполняется какая-то операция над файлом? Отсутствие файла, над которым выполняется какая-либо операция, может вызвать ошибку. Поэтому нужно удалять только старые файлы. Время жизни временных файлов можно вынести в настройки.

  1. Создаем консольную команду, с помощью которой будем чистить хранилище: php artisan make:command DeleteTempFiles. Регистрируем команду в Kernel.php

  2. Код самой команды:

<?php

namespace App\Console\Commands;

use Carbon\Carbon;
use Illuminate\Support\Facades\Storage;
use Illuminate\Console\Command;

class DeleteTempFiles extends Command
{
  /**
   * The name and signature of the console command.
   *
   * @var string
   */
  protected $signature = 'tmp:clean';

  /**
   * The console command description.
   *
   * @var string
   */
  protected $description = 'Clear temporary storage';

  protected $lifeTime;

  /**
   * Create a new command instance.
   *
   * @return void
   */
  public function __construct()
  {
    parent::__construct();

    // Setup temporary storage life time
    $this->lifeTime = config('filesystem.disks.temp.lifetime', 20 * 60 * 60); // 20ч
  }

  /**
   * Execute the console command.
   *
   * @return mixed
   */
  public function handle()
  {
    // Get all files from temporary storage
    $files = Storage::disk('temp')->allFiles();

    // Get a Carbon instance for the current date and time.
    $now = Carbon::now();

    // Iterate through all files in directory
    foreach ($files as $file) {
      // Get a Carbon instance for the file modified date and time.
      $modTimestamp = Storage::disk('temp')->lastModified($file);
      $modeDate = Carbon::createFromTimestamp($modTimestamp);

      // Calculate date difference
      $length = $modeDate->diffInSeconds($now);

      // Check if the file is old enough to delete it
      if ($length > $this->lifeTime) {
        Storage::disk('temp')->delete($file);
      }
    }
  }
}
  1. Очистка по расписанию с помощью Task Scheduling

Запуск планировщика

Документация

Добавляем новую крон задачу. Заменяем /FULL_PATH_ROOT/public_html на путь к корню сайта.

* * * * * php /FULL_PATH_ROOT/public_html/artisan schedule:run >> /dev/null 2>&1

Полученную задачу добавляем на хостинге в планировщике задач, либо на сервере через команду:

crontab -e

Определение расписаний

Документация

В метод schedule, который находится в app/Console/Kernel.php добавляем нашу команду

protected function schedule(Schedule $schedule)
{
  // ...
  $schedule->command('tmp:clean')->daily(); // каждый день в полночь
}

Изменить периодичность запуска можно через один из методов указанных тут.

Готово!