Я пытаюсь написать файл .tgz, содержащий десятки, если не сотни тысяч файловых записей, содержимое каждой из которых получено из строки в базе данных. Каждая запись файла составляет около 2-5k данных.
Я хочу избежать этого без необходимости сначала записывать файлы. В настоящее время у меня есть PHP, создающий традиционную структуру каталогов, пишущий файлы, затем создающий tgz из этого в самом конце, используя shellexec.
Диск, который мы используем, медленный, поэтому запись десятков тысяч файлов занимает много времени. Даже при запуске прототипа на другом компьютере с быстрым диском с использованием виртуального диска tmpfs и большим количеством процессоров, я получаю скорость около 100-200 записей в секунду, что кажется медленным — полчаса для 150 000 файлов в структуре каталогов. Как только это будет написано, фактическое преобразование из структуры каталогов собственной ОС в tgz не является проблематичным.
Я надеялся использовать PharData для написания. Однако PharData :: addFromString, похоже, выполняет запись в файл сразу после добавления файла, а не шаблон Open-> Add-> Writeout.
Кто-нибудь может предложить какие-либо стратегии здесь?
В конечном итоге файл tgz должен быть доступен для загрузки, и он не будет часто обновляться. Но поскольку необходимо создать серию этих файлов, необходимость подождать 30-60 и более минут, чтобы упаковать пакет, превращается в блокиратор.
Вы можете напрямую использовать функции php gzopen / gzwrite / gzclose и форматировать собственные заголовки tar, а затем вводить данные. Есть пример на страница документации php gzwrite.
Других решений пока нет …