Если я правильно понял, цель состоит в том, чтобы динамически создавать сжатые 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, сжимает и выводит их один за другим, не используя слишком много памяти или каких-либо файлов.