使用PHP在内存中操作存档(无需在磁盘上创建临时文件)

时间:2009-07-27 16:01:18

标签: php memory archive disk

我正在尝试在PHP中即时生成存档并立即将其发送给用户(不保存)。我认为没有必要在磁盘上创建一个文件,因为我发送的数据无论如何都不是持久的,但是,在搜索网络时,我无法找到方法。我也不关心文件格式。

所以,问题是:

是否可以在php脚本中创建和操作内存中的文件存档而不必在此过程中创建临时文件?

5 个答案:

答案 0 :(得分:44)

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

我遇到了zip.lib.php附带的unzip.lib.php / phpmyadmin脚本zip.lib.php并位于“libraries”目录中。

使用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(); 作为我的魅力:

zip.lib.php

此脚本允许下载zip,无需将文件作为真实文件或将zip本身保存为文件。

遗憾的是,此功能不是更通用的PHP库的一部分。

以下是phpmyadmin源代码中if (! defined('PHPMYADMIN')) { exit; } 文件的链接: https://github.com/phpmyadmin/phpmyadmin/blob/RELEASE_4_5_5_1/libraries/zip.lib.php

<强>更新 确保从zip.lib.php的开头删除以下检查,否则脚本将终止:

{{1}}

<强>更新 此代码也可以在CodeIgniter项目中使用: https://github.com/patricksavalle/CodeIgniter/blob/439ac3a87a448ae6c2cbae0890c9f672efcae32d/system/helpers/zip_helper.php

答案 1 :(得分:3)

您使用什么来生成存档?您可以使用流php:// temp或php:// memory来读取和写入存档。

请参阅http://php.net/manual/en/wrappers.php.php

答案 2 :(得分:2)

关于你的评论,php:// temp适合你,除非当你关闭它时,尝试保持打开,刷新输出,然后将其倒回到0并读取它。

点击此处查看更多示例:http://us.php.net/manual/en/function.tmpfile.php

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

答案 3 :(得分:0)

您需要使用ZipArchive::addFromString - 如果您使用addFile(),则在您关闭文件之前,实际上并未添加该文件。 (可怕的错误恕我直言,如果你试图将文件移动到拉链中,然后在关闭拉链之前删除它们,该怎么办...)
addFromString()方法会立即将其添加到存档中。

答案 4 :(得分:-7)

这里确实存在性能问题,还是只是冒犯了你的正确感?许多进程编写临时文件并将其删除,并且由于缓存,它们通常不会到达磁盘。

关闭时会自动删除临时文件。这就是它的本质。

我只能用两种方法在内存中创建一个zip文件并提供服务,这两种方式可能比它们的价值更麻烦。

  • 使用ram磁盘。
  • 修改ziparchive类以添加一个方法来执行close()方法所做的一切,除了实际关闭文件。 (或者将close-open参数添加到close()) 根据底层的C库,这甚至可能无法实现。