Планета

Наша планета собирает интересные статьи из различных источников и объединяет их в одну ленту. Которую можно читать на нашем сайте.

Подробнее »

Сообщество

Наше сообщество славится своим дружелюбием и стремлением делиться приобретённым опытом с новыми веб-разработчиками и пользователями ОС Linux.

Любой желающий может совершенно свободно зарегистрироваться на нашем сайте и принять активное участия в жизни сообщества!

Подробнее »

Donate

Мы с удовольствием и благодарностью примем любое пожертвования.

Подробнее »

Перестань использовать временные файлы в PHP

Если мы хотим создать CSV-файл в PHP, то сделать это можно при помощи функции fputcsv(). При этом удобно сохранить результат в временный файл, чтобы позже с ним было проще работать. Например предоставить файл для скачивания или отправить его по E-Mail.

Данный временный файл сохраняется где-то на жестком диски и нам самим приходится позаботиться о том, чтобы он был удалён. Мы можем написать Cron, который будет время от времени удалять старые файлы, и избовлять нас от лишнего мусора, однако данный подход всё равно не идеален.

Злоумышленик может использовать DDOS-атаку: просто вызывая функцию, которая будет создавать файл и тем самым может довольно быстро забить весь жесткий диск на сервере. Если же веб-сервер и сервер с базой данных находится на одной и той же машине, то таким способом можно легко положить I/O шину.

Используй потоки (Streams) вместо временных файлов

По мимо file:// и http:// есть и другие протоколы, которые поддерживает PHP, весь список можно посмотреть здесь: https://secure.php.net/manual/ru/wrappers.php. Нам же интересен протокол "php://".

Пример:

$stream = fopen('php://memory', 'r+');
fputcsv($stream, ['php', 'land'], ';', '"');
rewind($stream);
$content = stream_get_contents($stream);
fclose($stream);

Поток памяти (Memory-Stream) доступен только через обработчик файлов (File-Handle), при этом повторный вызов fopen('php://memory') создаст новый поток. Как это работает? Открывается новый поток, в него сохраняются данные, с помощью rewind() перемещается указатель в начало, чтобы данные можно было легко прочитать.

Это позволяет навсегда забять про временные файлы в PHP.

Если мы будем использовать данный подход при работе с большими данными (Big Data), то у нас может быстро закончиться память. Для этого мы можем указать предел использования памяти.

$stream = fopen('php://temp/maxmemory:10485760');

Надеюсь дананя статья была вам интересна и вы как я больше не будете использовать временные файлы в PHP.


У вас включён блокировщик рекламы (Adblocker, Adblocker Plus, uBlock).
Если вы хотите поддержать автора данного поста, пожалуйста выключите его!

Оставьте комментарий!

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий:


Написать новый комментарий