在php进程之间传递流中的多个文件

时间:2017-04-06 21:29:35

标签: php stream

我需要能够在服务器A上使用一个php用户进程通过http://来自另一个服务器B的流来请求数据,并且服务器B必须能够通过流返回多个文件。

然后,用户进程必须将其中一个文件发送到外部客户端,并将其他文件本地保存在服务器A上(稍后将由客户端请求)。基本上,我发送带有附带图像文件的svg文件。

我想通过单一流做到这一点。我不想在服务器B上将任何内容保存到光盘,并让用户逐一请求它。

最干净的方法是什么? 谢谢!

2 个答案:

答案 0 :(得分:0)

您可以根据需要为流编写尽可能多的内容:挑战在于接收方(服务器A上的PHP)必须能够识别每个下一个文件的开始位置。您可以自己考虑一些协议,例如将TLV写入流或仅使用后面的字节量文件内容为每个文件的内容添加前缀。请注意,使用此建议您将丢失文件名,因此您也需要合并这些文件名。但最好的方法可能是使用现有标准。在Linux世界中,人们经常使用TAR或TAR-GZ。您可以查看或使用ZIP。 This question包含有关如何执行此操作的一些选项。这两个建议都使用了库。

另一种方法是使用tempname使用临时文件:虽然是文件,但您不必管理清理。如果服务器B配置为在内存中具有tempdir,则符合您的要求: - )

Here is a similar question使用TAR-GZ。而this question的第二个答案显示了如何通过命令行tar命令写入从PHP通过PHP shell执行调用的stdout(具有不同级别的启用错误处理的各种选项)。< / p>

由于我在手机上写这个,我不能尝试提供一个例子。也许这个周末晚些时候我有时间编辑并添加工作代码来演示。如果你打败我,请随意自己动手​​: - )

答案 1 :(得分:0)

以下是我根据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()类来处理收到的文件。

由于两个不同但相关的原因,我对解决方案并不完全满意,我希望社区能帮助我改进:

  1. ZipStream组件将内容发送到输出缓冲区 在每次addFile调用时,直接作为副作用。这违反了面向对象的好处 实践。最好使用任意流资源 可以由对象返回。
  2. ZipArchive,出于某种原因,只加载文件系统中的文件。我必须将zip数据写入文件才能打开 使用ZipArchive对象,但它可以说是道德的 错了吗?!
  3. 这两个库都没有充分利用PHP的强大功能。关于如何做得更好的任何想法?