Php 如何通过多个http服务器传输二进制数据?

Php 如何通过多个http服务器传输二进制数据?,php,perl,http,Php,Perl,Http,好吧,问题并不是那么大。让我解释一下这个场景:我有两个http服务器。最终用户可以通过web浏览器访问服务器A,而服务器B是内部服务器,只能由服务器A访问。如果服务器B在本地磁盘中生成一些大的jpeg图像,而服务器A无法直接访问服务器B的文件系统,如何让最终用户看到这些图像而不首先将这些图像数据临时存储在服务器A中 我在服务器A上运行PHP,在服务器B上运行perl,但这并不重要。我需要一个实现这个的通用模式 显然,我们不能只将这些到映像的路径传递给服务器A,最终传递给最终用户 我认为这是唯一的

好吧,问题并不是那么大。让我解释一下这个场景:我有两个http服务器。最终用户可以通过web浏览器访问服务器A,而服务器B是内部服务器,只能由服务器A访问。如果服务器B在本地磁盘中生成一些大的jpeg图像,而服务器A无法直接访问服务器B的文件系统,如何让最终用户看到这些图像而不首先将这些图像数据临时存储在服务器A中

我在服务器A上运行PHP,在服务器B上运行perl,但这并不重要。我需要一个实现这个的通用模式

显然,我们不能只将这些到映像的路径传递给服务器A,最终传递给最终用户

我认为这是唯一的方法,但您不需要在服务器A上物理保存文件。在PHP中:如果服务器A可以在文件系统级别(即通过网络共享)与服务器B对话,服务器A可以从服务器B获取数据并将其传递给用户:

header("Content-type: image/jpeg"); // Make sure you send the right headers
$file = fopen("/path/to/server/b/huge/image.jpg", "r");
fpassthru($file);  // or deliver chunks using fread()
fclose($file);
如果只有内部http连接,您可以将第二行更改为

$file = fopen("http://serverb.local/huge/image.jpg", "r");
如果此方法对您来说太慢或不便于设置,则必须使用FTP、SCP或类似的方法。FTP在PHP中可用;使用
exec()
从PHP脚本调用其他协议可能最简单

根据您的场景和使用频率,您可能希望在服务器A上使用某种缓存,这样就不必每次都重复此操作

如果您的服务器托管在数据中心,请确保它们之间的通信是免费的,或者不会太贵


这是我能想到的让用户“看到”图像而不会阻塞服务器A的最简单的方法。

有很多解决方案,具体取决于您的控制程度以及服务器B与服务器A的隔离程度

一种方法是服务器B在与服务器a共享的网络卷上生成映像。服务器a将具有只读访问权限以提供一点安全性。然后服务器A可以直接访问有问题的文件。与在服务器a上编写直通程序相比,它的优点是速度更快,因为唯一额外的开销是网络驱动器,并且它允许服务器B与服务器a保持完全隔离


这确实假设服务器A不需要请求服务器B生成映像,它们就在那里。

在给定的约束条件下,这是正确的解决方案。只是想补充一点,你不需要网络共享,fopen可以读取内部url。所以$file=fopen(')也可以。@elviejo:对不起,什么是“myServerBlp”?@solotim如果我理解@elviejo是正确的,它是服务器B的IP。这是正确的(这甚至可能是唯一的方式,取决于场景),但它将使用HTTP传输协议。我认为http比直接使用网络共享更慢,对服务器B的压力也更大。谢谢您的解释。我认为Blp是一种缩略语。:)非常感谢。我要更新我的问题,对不起,服务器A不允许访问服务器B的文件系统。它不是服务器B上的物理磁盘,而是对A和B都可见的网络驱动器。事实上,它可能是服务器A上的共享卷,假设服务器A可以接受来自服务器B的连接。这里缺少的神奇词语是“代理”。