我需要能够在服务器A上使用一个php用户进程通过http://来自另一个服务器B的流来请求数据,并且服务器B必须能够通过流返回多个文件。
然后,用户进程必须将其中一个文件发送到外部客户端,并将其他文件本地保存在服务器A上(稍后将由客户端请求)。基本上,我发送带有附带图像文件的svg文件。
我想通过单一流做到这一点。我不想在服务器B上将任何内容保存到光盘,并让用户逐一请求它。
最干净的方法是什么? 谢谢!
答案 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()类来处理收到的文件。
由于两个不同但相关的原因,我对解决方案并不完全满意,我希望社区能帮助我改进:
这两个库都没有充分利用PHP的强大功能。关于如何做得更好的任何想法?