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元素,逐个压缩并输出它们,而不使用太多内存或任何文件.

上一篇:命名管道在Python中不会刷新


下一篇:copyFile