如何处理保存在单独服务器上的媒体(PHP)

时间:2010-03-31 19:55:21

标签: php image caching media

所以,我有三台服务器,其目的是将所有媒体(图像,文件,电影)保存在媒体服务器上。我从来没有去做过,但我想我应该这样做。

所以这些是三台服务器:

WWW服务器 DB服务器 媒体服务器

访问者显然连接到WWW服务器,当前图像调整大小和缓存:在WWW服务器上完成,因为原始文件保存在那里。因此,我的想法是我拥有的图像功能,所有图像合成,调整大小和cahceing只会将命令发送到媒体服务器,它将返回到完成文件的路径。

我不知道的是如何处理诸如file_exists()之类的功能,并在需要之前确定图像尺寸,甚至在任何图像管理发挥作用之前。我是否通过HTTP将所有这些命令传递给其他服务器?我正在考虑这样做的方式:

function image(##ARGS##){
    if ($GLOBALS["media_host"] != "localhost"){
        list ($src, $width, height) = file('http://$GLOBALS[media_host]/imgfunc.php?args=##ARGS##');
        return "<img src='$src' height and width >";
    }
    .... do other stuff here 
}

我接近这个错误的方式吗?有更好的方法吗?

5 个答案:

答案 0 :(得分:2)

不确定您的用途,但我也将媒体文件保存在与我的代码不同的服务器上:

我使用Amazon S3来存储我的媒体文件,我只是在我的HTML文件的头部包含一个基本标记,以使其全部工作。基本上,它需要所有相关文件/链接,并将这些相对路径指向另一台服务器。

<base href="https://s3.amazonaws.com/BUCKET/PROJECT/FOLDER/" />

有些人可能会以这种方式反对我对base href标签的使用,但它对我来说非常有用。通过这种方式,我可以将所有图像加载带宽定向到亚马逊并远离我的服务器。

答案 1 :(得分:1)

想象一下,将媒体服务器作为S3存储桶,可能会让您的生活更容易理解应该在哪里发生。在媒体服务器上安装lighthttpd并直接从那里提供图像。对于存储,在主服务器上处理图像,将图像上传到媒体服务器,将与图像相关的所有信息存储在数据库中,这样当您想要提供它时,您已经拥有了所有可用的信息并且您已经假定由于所有正确的原因,图像仍然存在:)

至于你想要的方式,我认为它会造成严重的瓶颈并引发大量的网络流量,你有点试图实现分布式系统中的“消息”,我们都知道那里涉及的陷阱。我说保持简单!

答案 2 :(得分:1)

要查明是否存在远程文件,请运行HEAD请求:

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "url here");
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_NOBODY, true);
curl_exec($curl);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);

if($code == 200)
    // The file exists.

答案 3 :(得分:0)

您需要在媒体服务器上打开一个端口来检索信息,这正是您正在做的事情。您的方法很好(只要您可以在公共端口上使用此功能就可以了。)

我假设任何媒体文件信息都没有存储在数据库中。

答案 4 :(得分:0)

除非您通过使用哑(非脚本)主机节省大量成本,否则这是一个坏主意 - 它会使系统失败的概率翻倍。如果您有2台主机,最好的解决方案是将它们作为精确的镜像。如果您需要进行会话/数据复制,那么这确实会带来很小的开销 - 但这是值得的。通过循环DNS分配负载。此外,它意味着您只需备份一个站点,并且可以从单个服务器(例如您的开发盒)扩展到......很多。

我还建议您不要存储已提交文件的修改版本(初始转换除外,以防止他们在您的服务器上发布您不想要的内容)。然后根据需要转换内容(并使用服务器端缓存)。

通过不同的DNS名称提供内容的一个优点是,大多数浏览器将并行运行更多请求 - 但您仍可以使用多个虚拟主机或通配符虚拟主机对克隆服务器执行此操作。

下进行。