我根据来自我的数据库(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_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元素,逐个压缩并输出它们,而不使用太多内存或任何文件.