嗯,问题并不是那么大。让我解释一下这个场景:我有两台http服务器。服务器A可通过Web浏览器访问最终用户,而服务器B是内部服务器,只能由服务器A访问。如果服务器B在本地磁盘中生成一些大的jpeg映像,则服务器A无法直接访问服务器B的文件系统,如何让最终用户看到那些图像而不首先将这些图像数据暂时存储在服务器A中?
我在服务器A上运行PHP,在服务器B上运行perl,但这不重要。我需要一个通用的模式来实现它。
答案 0 :(得分:3)
显然,我们不能只将这些路径传递给服务器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");
如果这种方法对你来说太慢或者设置不方便,你将不得不使用(S)FTP,SCP或类似的东西。 FTP以PHP natively提供;其他协议可能最容易使用exec()
从PHP脚本调用。
根据您的方案和使用频率,您可能希望在服务器A上使用某种缓存,因此不必每次都重复此操作。
如果您的服务器托管在数据中心,请确保它们之间的流量免费或不太昂贵。
这是我能想到的让用户“看到”图像而不会堵塞服务器A的最简单方法。
答案 1 :(得分:0)
有许多解决方案,具体取决于您拥有多少控制权以及服务器A与服务器A的隔离程度。
服务器B的一种方法是在与服务器A共享的网络卷上生成映像。服务器A具有只读访问权限以提供一些安全性。然后,服务器A可以直接访问相关文件。在服务器A上编写传递程序的优点是它可能更快,因为唯一的额外开销是网络驱动器,它允许服务器B与服务器A保持完全隔离。
这确实假设服务器A不需要请求服务器B生成图像,它们就在那里。