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

问题描述:

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

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

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

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

+1

在你的问题的现有措辞你说“本地保存别人”,但同时也是“我不希望保存任何东西到光盘”。我不明白你想要什么或“本地保存其他人”的意思。 –

+0

感谢您的评论。我澄清了这个问题。我可能会探索将所有文件发送给客户端的选项,但现在这不是必需的。 – Vakarelov

您可以根据需要尽可能多地写入流:挑战在于接收端(服务器A上的PHP)必须能够识别每个下一个文件的开始位置。你可以自己想一些协议,例如请将TLV写入流中,或者仅将每个文件的内容加上随后的字节文件内容量。请注意,有了这个建议,你将失去文件名,所以你也需要合并这些文件。但最好的方法可能是使用现有的标准。在Linux世界中,人们经常使用TAR或TAR-GZ。您可以查看该文件或使用ZIP代替。 This question包含一些关于如何做到这一点的选项。两个建议都使用一个库。

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

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

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

+0

我会先研究ZipArchive选项。写一个协议只是另一个可能导致系统崩溃的地方。我甚至可以考虑将档案直接传递给客户,并由JS处理。关于临时文件,我想避免的是服务器A独立请求每个文件。 “文件”根本不是真正的服务器B上的文件。它们只是刺激或数据流。 – Vakarelov

这是我没有以下的一些货车Leeuwen的建议:

在服务器B面,我用maennchen/ZipStream-PHP成分,使用呼叫如这些,在代码的不同部分:

$zipArchive = new ZipStream(); 
$zipArchive->addFile($file_name, $image->getImageBlob()); 
$zipArchive->addFile($this->getId().".svg", $svg); 
$zipArchive->finish(); 

在服务器B侧I中使用的ZipArchive()类,以处理所接收的文件。

我并不完全满意的解决方案为两个不同但连接的原因,而我希望社会各界能够帮助我提高:

  1. 的ZipStream组件直接将内容发送到输出缓冲区 ,在每个addFile调用中,作为一个副作用。这违反了面向对象的良好做法 的做法。最好使用可由对象返回的任意流资源 。
  2. 由于某些原因,ZipArchive仅从文件系统加载文件。我必须将zip数据写入一个文件,以便能够使用ZipArchive对象在 中打开,该对象可以正常工作,但我们可以说道德 错误?!

这两个库都没有充分利用PHP的真棒流的力量。有关如何更好地做到这一点的想法?