PHP 动态刷新 xml 到 zipfile 并推送下载



我根据数据库中的信息(xmltv格式(创建一个xml文件。这些xml文件可能很大 - 25-70mb是正常的。现在我像这样动态创建 xml 文件:

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

并通过循环刷新以防止内存溢出。我还设置了标头以将内容推送为下载:

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

由于大小,我希望能够压缩/gzip xml。这在飞行中可能吗?我以前使用过 PHPZip,它适用于文件,但我不知道我是否可以将 xml 输出直接写入 zip?

如果我理解正确,目标是动态创建 gzip 压缩数据,而无需在服务器上创建文件。这在deflate_initdeflate_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元素,逐个压缩和输出它们,而不使用太多内存或任何文件。

最新更新