Создаем папку, которая будет содержать временные файлы. Обычно это 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') // получение инстанса диска
Подробнее о хранилище и о том, что можно с ним делать в доке на официальном сайте
Автоочистка временного хранилища
Чтобы не захламлять сервер временными файлами, временное хранилище нужно время от времени проверять и вычищать от скопившихся файлов. Но нельзя просто взять и единовременно удалить все файлы хранилища. А что если в момент очистки выполняется какая-то операция над файлом? Отсутствие файла, над которым выполняется какая-либо операция, может вызвать ошибку. Поэтому нужно удалять только старые файлы. Время жизни временных файлов можно вынести в настройки.
-
Создаем консольную команду, с помощью которой будем чистить хранилище:
php artisan make:command DeleteTempFiles
. Регистрируем команду вKernel.php
-
Код самой команды:
<?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);
}
}
}
}
- Очистка по расписанию с помощью 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(); // каждый день в полночь
}
Изменить периодичность запуска можно через один из методов указанных тут.
Готово!