在php进程之间的流中传递多个文件
我需要能够让服务器a上的一个php用户进程通过http://stream从另一个服务器B请求数据,并且服务器B必须能够通过该流返回多个文件 然后,用户进程必须将其中一个文件发送到外部客户机,并将其他文件保存在服务器A上的本地位置(稍后由客户机请求)。基本上,我发送的是一个svg文件及其附带的图像文件 我想通过单流来实现这一点。我不想将任何内容保存到服务器B上的光盘上,让用户逐个请求 最干净的方法是什么?在php进程之间的流中传递多个文件,php,stream,Php,Stream,我需要能够让服务器a上的一个php用户进程通过http://stream从另一个服务器B请求数据,并且服务器B必须能够通过该流返回多个文件 然后,用户进程必须将其中一个文件发送到外部客户机,并将其他文件保存在服务器A上的本地位置(稍后由客户机请求)。基本上,我发送的是一个svg文件及其附带的图像文件 我想通过单流来实现这一点。我不想将任何内容保存到服务器B上的光盘上,让用户逐个请求 最干净的方法是什么? 谢谢 您可以随心所欲地写入流:挑战在于接收方(服务器A上的PHP)必须能够识别下一个文件的起
谢谢 您可以随心所欲地写入流:挑战在于接收方(服务器A上的PHP)必须能够识别下一个文件的起始位置。您可以自己考虑一些协议,例如写入流,或者只是在每个文件的内容前面加上后面文件内容的字节数。请注意,使用此建议将丢失文件名,因此也需要合并这些文件名。但最好的方法可能是使用现有的标准。在linux世界中,人们经常使用TAR或TAR-GZ来实现这一点。您可以查看这一点,也可以使用ZIP。包含有关如何执行此操作的一些选项。这两个建议都使用了一个库 另一种选择是使用
tempname
使用临时文件:尽管它是一个临时文件,但您不必管理清理。如果服务器B配置为在内存中具有tempdir,则满足您的要求:-)
关于使用TAR-GZ。第二个答案显示了如何通过命令行tar
将命令写入到stdout,通过PHP shell执行从PHP调用(针对不同级别的错误处理的各种选项)
因为我是在电话上写的,所以我无法尝试提供一个例子。也许这个周末晚些时候我有时间编辑和添加工作代码来演示。如果你比我快一点的话,你可以自己做:-)以下是我按照van Leeuwen的一些建议所做的: 在服务器B端,我使用了maennchen/ZipStream PHP组件,在代码的不同部分使用了如下调用:
$zipArchive = new ZipStream();
$zipArchive->addFile($file_name, $image->getImageBlob());
$zipArchive->addFile($this->getId().".svg", $svg);
$zipArchive->finish();
在服务器B端,我使用ZipArchive()类来处理接收到的文件
出于两个不同但相关的原因,我对解决方案并不完全满意,我希望社区能帮助我改进:
这两个库都没有充分利用PHP强大的流功能。关于如何做得更好,您有什么想法吗?在您问题的当前措辞中,您说“在本地保存其他人”,但同时也说“我不想将任何内容保存到光盘”。我不明白你想要什么,也不明白“在本地保存其他人”是什么意思。谢谢你的评论。我澄清了这个问题。我可能会在稍后探索将所有文件发送到客户端的选项,但目前这不是必需的。我将首先探索ZipArchive选项。编写协议只是系统可能崩溃的另一个地方。我甚至可以考虑将存档传递给客户端,并由JS处理。关于临时文件,我要避免的是服务器独立地请求每个文件。“文件”根本不是服务器B上的真正文件。它们只是刺或数据流。