Если мы хотим создать CSV-файл в PHP, то сделать это можно при помощи функции fputcsv(). При этом удобно сохранить результат в временный файл, чтобы позже с ним было проще работать. Например предоставить файл для скачивания или отправить его по E-Mail.
Данный временный файл сохраняется где-то на жестком диски и нам самим приходится позаботиться о том, чтобы он был удалён. Мы можем написать Cron, который будет время от времени удалять старые файлы, и избовлять нас от лишнего мусора, однако данный подход всё равно не идеален.
Злоумышленик может использовать DDOS-атаку: просто вызывая функцию, которая будет создавать файл и тем самым может довольно быстро забить весь жесткий диск на сервере. Если же веб-сервер и сервер с базой данных находится на одной и той же машине, то таким способом можно легко положить I/O шину.
По мимо 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.
![]() |
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий: