Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php进程之间的流中传递多个文件_Php_Stream - Fatal编程技术网

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

在php进程之间的流中传递多个文件,php,stream,Php,Stream,我需要能够让服务器a上的一个php用户进程通过http://stream从另一个服务器B请求数据,并且服务器B必须能够通过该流返回多个文件 然后,用户进程必须将其中一个文件发送到外部客户机,并将其他文件保存在服务器A上的本地位置(稍后由客户机请求)。基本上,我发送的是一个svg文件及其附带的图像文件 我想通过单流来实现这一点。我不想将任何内容保存到服务器B上的光盘上,让用户逐个请求 最干净的方法是什么? 谢谢 您可以随心所欲地写入流:挑战在于接收方(服务器A上的PHP)必须能够识别下一个文件的起

我需要能够让服务器a上的一个php用户进程通过http://stream从另一个服务器B请求数据,并且服务器B必须能够通过该流返回多个文件

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

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

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

您可以随心所欲地写入流:挑战在于接收方(服务器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()类来处理接收到的文件

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

  • ZipStream组件将内容发送到输出缓冲区 直接地,在每次addFile调用时,作为副作用。这违反了面向对象的良好特性 练习。最好使用任意流资源 可以由对象返回的
  • 出于某种原因,ZipArchive仅从文件系统加载文件。我必须将zip数据写入一个文件才能在中打开 使用ZipArchive对象,这是可行的,但也就是说,在道德上 错了
    这两个库都没有充分利用PHP强大的流功能。关于如何做得更好,您有什么想法吗?

    在您问题的当前措辞中,您说“在本地保存其他人”,但同时也说“我不想将任何内容保存到光盘”。我不明白你想要什么,也不明白“在本地保存其他人”是什么意思。谢谢你的评论。我澄清了这个问题。我可能会在稍后探索将所有文件发送到客户端的选项,但目前这不是必需的。我将首先探索ZipArchive选项。编写协议只是系统可能崩溃的另一个地方。我甚至可以考虑将存档传递给客户端,并由JS处理。关于临时文件,我要避免的是服务器独立地请求每个文件。“文件”根本不是服务器B上的真正文件。它们只是刺或数据流。