用PHP处理内存中的存档(不在磁盘上创建临时文件)
我试图在PHP中即时生成存档并立即将其发送给用户(不保存它)。我认为不需要在磁盘上创建文件,因为我发送的数据并不是永久的,但是,在搜索网页时,我无法找到如何。我也不关心文件格式。用PHP处理内存中的存档(不在磁盘上创建临时文件)
所以,问题是:
是否可以创建和操作一个PHP脚本内存储器中的文件归档,而无需创建沿途临时文件?
我有同样的问题,但终于找到了一个有点晦涩的解决方案,并决定在这里分享。
我来到与phpmyadmin
并位于“库”目录中的伟大zip.lib.php
/unzip.lib.php
脚本。
使用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库的一部分。
下面是从phpMyAdmin的源到zip.lib.php
文件的链接: https://github.com/phpmyadmin/phpmyadmin/blob/RELEASE_4_5_5_1/libraries/zip.lib.php
UPDATE: 务必从zip.lib.php的开始,因为否则脚本只是删除下列检查终止:
if (! defined('PHPMYADMIN')) {
exit;
}
UPDATE: 该代码可从笨项目,以及: https://github.com/patricksavalle/CodeIgniter/blob/439ac3a87a448ae6c2cbae0890c9f672efcae32d/system/helpers/zip_helper.php
你用什么来生成档案?您可能可以使用流php:// temp或php://内存来读写档案。
目前,我使用php zip扩展名,并在我提供下载时编写一个临时文件。 我尝试使用php:// temp wrapper(鉴于它优于php://内存,因为大量数据,临时文件是一个好主意,并且主机甚至可以在限制fs访问时允许使用它。 我遇到了问题,我不得不关闭zipfile,它显式释放了php:// temp /中的所有内容(关闭之前和之后从zipfile中读取给了我0字节)。 无论如何,不用关心我使用的库,只要它可以工作,当然PHP是内部的优先选择 – ralokt 2009-07-28 07:10:44
是否真的有性能问题在这里,还是只是得罪你的正当性的意义吗?很多进程都会写入临时文件并将其删除,而且由于缓存的原因,它们通常不会打到磁盘。
关闭时会自动删除临时文件。这就是天性。
只有两种方法可以考虑在内存中创建一个zip文件并为其提供服务,这两种方式可能比他们的价值更麻烦。
- 使用RAM磁盘。
- 修改ziparchive类以添加一个方法,该方法执行close()方法所做的一切,除了实际上关闭文件。 (或者添加一个leave-open参数来关闭())。
这可能甚至不可能取决于底层的C库。
关于您的评论,除非您关闭它,否则请尝试保持打开状态,刷新输出,然后倒回到0并阅读。
在这里寻找更多的例子:http://us.php.net/manual/en/function.tmpfile.php
而且研究成果缓冲和捕获:http://us.php.net/manual/en/function.ob-start.php
您需要使用ZipArchive::addFromString
- 如果你使用addFile()
实际上并没有添加文件,直到你去关闭它。 (可怕的错误恕我直言,如果你试图将文件移动到一个zip文件,并在关闭zip文件之前删除它们......)addFromString()
方法会立即将它添加到存档中。
该存档文件是否只包含一个文件或多个文件? – VolkerK 2009-07-27 17:04:41
在我的具体情况下,它包含多个。 另外我会认为,“任意”大型档案(项目明智)的解决方案更有趣(在我的情况下,我可以使用临时文件,但那些必须使用服务器,他们访问文件系统受限制)? – ralokt 2009-07-28 06:58:03