• Время чтения ~1 мин
  • 29.02.2024

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

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

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

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

// Download the file
// Process it
// Clean up

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

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

use Spatie\TemporaryDirectory\TemporaryDirectory;

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

// Or using the make() static constructor
$tmpDir = TemporaryDirectory::make();

// Return a path inside the temporary directory
$tmpDir->path('659c896e52a29.mov');
// return /tmp/490784976-0213323001704757672/659c896e52a29.mov

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

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

// Normalize the video and get the filename
$videoUrl = str($videoUrl)->replace(' ', '%20');
$tmpFile = $videoUrl->afterLast('/');

// Create a temporary directory and download a file to that path
$tmpDir = TemporaryDirectory::make();
$tmpPath = $tmpDir->path($tmpFile);
Http::sink($tmpPath)->throw()->get($videoUrl->toString());

// Process the file
// Cleanup the temporary file
$tmpFile->delete();

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

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

// Or via `make()`
$tmpDir = TemporaryDirectory::make()->deleteWhenDestroyed();

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

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

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Об авторе CrazyBoy49z
WORK EXPERIENCE
Контакты
Ukraine, Lutsk
+380979856297