oracloid
совсем кукус
Временный файл
Задача такая: для экономии оперативки я перехватываю всю выдачу скрипта и скидываю порциями в файл, очищая при этом буфер. В конце работы файл надо выдать пользователю. Файлы могут получаться большими (> 100 Мб).
Я вначале сделал работу с файлом через tmpfile(), чтобы не парицо в случае фатальных ошибок скрипта. Возникновение таких ошибок я не могу отследить, т.к. используются лямбда-функции, и что там в них за код неизвестно (он не мой). То есть у меня бывают ошибки парсинга, которые не может перехватить set_error_handler().
В случае успеха я отдаю файл так:
И вот это echo мне очень не нравится!
В данном случае файл будет сначала зачитан в память, во временную переменную, и только потом выдан stdout.
Альтернатива - использовать readfile(), которая сразу выдает файл в поток.
Но тогда я не защищен от кучи временных файлов, которые останутся при аварийном завершении скрипта.
Каждый раз при старте скрипта искать и удалять такие файлы? А по каким критериям я пойму, что файл надо удалить? По дате? Но за несколько минут таких файлов может получиться очень много, а диски на сервере не резиновые.
Просто тупо делать foreach( glob() ) @unlink()? Открытые файлы не удалятся...
Какие есть мысли?
Задача такая: для экономии оперативки я перехватываю всю выдачу скрипта и скидываю порциями в файл, очищая при этом буфер. В конце работы файл надо выдать пользователю. Файлы могут получаться большими (> 100 Мб).
Я вначале сделал работу с файлом через tmpfile(), чтобы не парицо в случае фатальных ошибок скрипта. Возникновение таких ошибок я не могу отследить, т.к. используются лямбда-функции, и что там в них за код неизвестно (он не мой). То есть у меня бывают ошибки парсинга, которые не может перехватить set_error_handler().
В случае успеха я отдаю файл так:
PHP:
fseek($this->swap_handle, 0);
echo fread($this->swap_handle, $this->swap_size);
В данном случае файл будет сначала зачитан в память, во временную переменную, и только потом выдан stdout.
Альтернатива - использовать readfile(), которая сразу выдает файл в поток.
Но тогда я не защищен от кучи временных файлов, которые останутся при аварийном завершении скрипта.
Каждый раз при старте скрипта искать и удалять такие файлы? А по каким критериям я пойму, что файл надо удалить? По дате? Но за несколько минут таких файлов может получиться очень много, а диски на сервере не резиновые.
Просто тупо делать foreach( glob() ) @unlink()? Открытые файлы не удалятся...
Какие есть мысли?

