在PHP内存操纵存档(不创建磁盘上的临时文件)(Manipulate an Archive in m

2019-06-17 16:51发布

我试图生成存档在PHP上的飞,并立即发送给用户(但不保存)。 我想,就没有必要在磁盘上,我要送的数据创建一个文件是不是持久的,无论如何,然而,在网上搜索,我找不到如何。 我也不在乎的文件格式。

所以,问题是:

是否有可能创建和操作一个PHP脚本内存储器中的文件归档,而无需创建沿途临时文件?

Answer 1:

我有同样的问题,但终于找到了一个有点模糊的解决方案,并决定在这里分享。

我来翻过大zip.lib.php / unzip.lib.php它配备了脚本phpmyadmin和位于“库”目录。

使用zip.lib.php担任魅力对我来说:

require_once(LIBS_DIR . 'zip.lib.php');

... 

//create the zip
$zip = new zipfile();

//add files to the zip, passing file contents, not actual files
$zip->addFile($file_content, $file_name);

...

//prepare the proper content type
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=my_archive.zip");
header("Content-Description: Files of an applicant");

//get the zip content and send it back to the browser
echo $zip->file();

这个脚本允许拉链的下载,而不需要具有文件作为真正的文件或保存拉链本身作为一个文件。

这是一个耻辱,这个功能是不是更通用的PHP库的一部分。

下面是该链接zip.lib.php从phpMyAdmin的源文件: https://github.com/phpmyadmin/phpmyadmin/blob/RELEASE_4_5_5_1/libraries/zip.lib.php

更新:确保你从zip.lib.php的开始删除以下支票否则脚本只是终止:

if (! defined('PHPMYADMIN')) {
    exit;
}

更新:该代码可从笨项目,以及: https://github.com/patricksavalle/CodeIgniter/blob/439ac3a87a448ae6c2cbae0890c9f672efcae32d/system/helpers/zip_helper.php



Answer 2:

你在使用生成的存档? 您可能能够使用流PHP://临时或php://内存读取和存档写入/。

见http://php.net/manual/en/wrappers.php.php



Answer 3:

关于你的评论在PHP://临时为你工作,当你关闭它除了,尽量保持它打开,刷新输出,然后倒带回到0和阅读。

在这里寻找更多的例子: http://us.php.net/manual/en/function.tmpfile.php

同时研究输出缓冲和捕获: http://us.php.net/manual/en/function.ob-start.php



Answer 4:

您需要使用ZipArchive::addFromString -如果你使用addFile()的文件实际上并未添加,直到你去关闭它。 (可怕的错误恕我直言,如果你想什么文件移动到一个zip和删除它们在关闭前拉链......)
addFromString()方法会立即添加到档案文件。



Answer 5:

是否真的有性能问题在这里,还是只是得罪你的正当性的意义吗? 很多进程写入临时文件并删除它们,而且往往他们从来没有击中磁盘因缓存。

封闭时临时文件被自动删除。 这是它的本质。

只有两种办法我能想到的在内存中创建一个zip文件和服务,并都可能是更多的麻烦比他们的价值。

  • 使用RAM磁盘。
  • 修改ziparchive类添加,做一切的close()方法做的方法, 实际上关闭文件。 (或添加为免洗型开放参数关闭())。
    这取决于底层C库,这可能甚至是不可能的。


文章来源: Manipulate an Archive in memory with PHP (without creating a temporary file on disk)