Простое управление временными файлами в Laravel

Источник: «Easily Manage Temporary Files in Laravel»
Узнайте, как PHP-пакет spatie/temporary-directory упрощает работу с путями временных файлов в Laravel и других PHP-проектах.

Недавно мне довелось работать с очередью, в которой требовалось временно загрузить файл на сервер, обработать его и, наконец, очистить временный файл. В PHP это несложно, и вы могли бы начать с чего-то вроде следующего:

file_put_contents('/tmp/' . $tmpFile, file_get_contents($video));

Для большей кроссплатформенности можно использовать встроенную PHP функцию sys_get_temp_dir(), позволяющую получить путь к директории, используемой для временных файлов:

$basePath = rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR);
$tmpPath = $basePath.$tmpFile;

// Загрузить файл
// Обработать
// Очистить

Всё это хорошо, но в Spatie есть простой, но эффективный пакет, который прекрасно очищает этот шаблонный код с помощью небольшого пакета spatie/temporary-directory. Я уже рассказывал о различных пакетах Spatie, но этот пакет удивил меня и стал одним из моих любимых.

Пакет состоит из одного класса (и двух классов исключений) и предоставляет хороший объектно-ориентированный интерфейс для создания и управления временными файлами:

use Spatie\TemporaryDirectory\TemporaryDirectory;

$tmpDir = (new TemporaryDirectory())->create();

// Или используя статический конструктор make()
$tmpDir = TemporaryDirectory::make();

// Возвращает путь внутри временного каталога
$tmpDir->path('659c896e52a29.mov');
// возвращает /tmp/490784976-0213323001704757672/659c896e52a29.mov

На примере обработки видео-файла я могу загрузить файл во временный каталог с помощью метода sink() HTTP-клиента Laravel:

use Illuminate\Support\Facades\Http;
use Spatie\TemporaryDirectory\TemporaryDirectory;

// Нормализация видео и получение имени файла
$videoUrl = str($videoUrl)->replace(' ', '%20');
$tmpFile = $videoUrl->afterLast('/');

// Создание временного каталога и загрузка файла по этому пути
$tmpDir = TemporaryDirectory::make();
$tmpPath = $tmpDir->path($tmpFile);
Http::sink($tmpPath)->throw()->get($videoUrl->toString());

// Обработка файла

// Очистка временного файла
$tmpFile->delete();

Отлично! У нас есть инкапсулированный, последовательный способ создания временного каталога и файлов в нем, а также возможность последующей очистки. Spatie также делает очистку более удобной, используя следующий метод при создании объекта:

$tmpDir = (new TemporaryDirectory())
->deleteWhenDestroyed()
->create();

// Или через `make()`
$tmpDir = TemporaryDirectory::make()->deleteWhenDestroyed();

Метод deleteWhenDestroyed() удалит каталог с помощью метода __destruct() объекта, так что вам не придётся беспокоиться о последующей очистке.

В этом пакете есть и другие преимущества, такие как настраиваемое имя и расположение каталога, а также метод, позволяющий очистить временный каталог от всех файлов. Документацию можно посмотреть в readme проекта, в GitHub репозитории spatie/temporary-directory.

Дополнительные материалы

Предыдущая Статья

Совет по безопасности: Не используйте nl2br()!

Следующая Статья

История compact() и extract()