PHP на лету сбрасывает xml в zipfile и запускает загрузку - PullRequest
0 голосов
/ 10 октября 2018

Я создаю файл xml на основе информации из моей базы данных (формат xmltv).Эти xml файлы могут быть довольно большими - 25-70 Мб - это нормально.Теперь я создаю XML-файл на лету, как это:

$xmlWriter = new XMLWriter();
$xmlWriter->openURI('php://output');

и промываю цикл, чтобы предотвратить переполнение памяти.Я также установил заголовки для загрузки содержимого в виде загрузки:

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $config->filename . '.xml"');

Я бы хотел иметь возможность сжать / сжать xml из-за размера.Это возможно на лету?Раньше я использовал PHPZip, который хорошо работает с файлами, но я не знаю, смогу ли я записать вывод XML непосредственно в zip-файл?

1 Ответ

0 голосов
/ 16 октября 2018

Если я правильно понял, цель состоит в том, чтобы динамически создавать сжатые gzip данные, не создавая файл на сервере.Это возможно с deflate_init и deflate_add, но требует PHP 7.

$gzip = deflate_init(ZLIB_ENCODING_GZIP, array('level' => 9));
$data = deflate_add($gzip, "my", ZLIB_NO_FLUSH);
$data .= deflate_add($gzip, "data", ZLIB_FINISH);

С deflate_add мы можем добавить больше данных на любое количествораз (режим должен быть ZLIB_FINISH для последней порции).

Мы можем настроить этот метод, используя XMLWriter::openMemory (сохраняет данные в памяти) и XMLWriter::flush, чтобы архивировать элементы xml по мере их создания и создавать содержимое файла .gz на лету.Например, этот код:

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="file.gz"');

$xmlWriter = new XMLWriter();
$xmlWriter->openMemory();
$xmlWriter->startDocument('1.0', 'UTF-8');
$gzip = deflate_init(ZLIB_ENCODING_GZIP, array('level' => 9));

for ($i = 0; $i < 10; $i++) {
    $xmlWriter->writeElement("element", $i);
    $data = $xmlWriter->outputMemory();
    echo deflate_add($gzip, $data, ZLIB_NO_FLUSH);
}
echo deflate_add($gzip, "", ZLIB_FINISH);

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

...