什么是一种有效的图像服务方式(PHP)?

时间:2010-06-05 15:36:11

标签: php

嘿,目前我正在考虑使用图像处理程序脚本提供图像。我有两个图像来源。一个来自我的Web图像文件夹,其中提供了用于构建我的站点界面的图像。另一个是在每个用户图像文件夹中,他们可以存储自己的图像。我想给每个用户图像一个唯一的ID,然后用图像处理程序脚本搜索该id并提供图像,并更改文件名。问题是我的站点图像文件夹在数据库中没有任何信息,因此没有ID,我应该直接服务吗?这种服务用户图像的方式似乎并不是最有效的。如果有人有任何建议我会非常感激。

$sql="SELECT username,file_name FROM images WHERE id=?";
$stmt=$conn->prepare($sql);
$result=$stmt->execute(array($ID));

while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
$image_name = $row['file_name'];
$username = $row['username'];
}

$path="$username/images/$image_name";


header("Expires: -1");

header("Cache-Control: no-store, no-cache, must-revalidate");

header("Cache-Control: post-check=0, pre-check=0", false);

readfile($path);

4 个答案:

答案 0 :(得分:4)

提供图片的最有效方法是将它们全部放在一个单独的静态cookie-free domain上。这就是像Flickr这样的网站的工作方式。您需要存储在数据库中的所有内容都足以构建静态URL。

答案 1 :(得分:3)

提供图像的最有效方法是根本不使用PHP。

让您的网络服务器直接从磁盘提供图像。无论如何,他们最终都被Linux缓存在内存中,所以它真的很快。比你在PHP中可以做的任何事情快几倍。加载萤火虫并自己尝试。观察apache从磁盘返回映像所需的时间,而不是脚本(我在一年前使用类似的脚本使用readfile())。差异很大。如果你运行像ab或httperf这样的负载测试器,你可能会看到每秒请求的差异更大。

总是有X-Sendfile,有些http服务器支持。

或者,考虑在脚本前放置一个缓存反向代理,如清漆,这样你至少

答案 2 :(得分:2)

最明显有效的方式是放弃PHP并让它直接由Apache提供缓存。有没有什么理由你必须以这种方式跟踪图像,你只能在事后解析access_log?为什么没有缓存,我假设一个新的图像获得一个新的唯一ID,而不是一个旧的?

话虽如此:如果你确实需要数据库检索&使用php提供服务,虽然是用户名命名的文件夹,这可能是一个非常有效的安全问题。也许将查询结果缓存在memcached中的某个地方,就像它一样。

答案 3 :(得分:0)

我不确定我的问题是什么,但在您的模板中,而不是:

<img src="image_handler.php?id=123" />

你应该写:

<?php
    $file_data = get_file_data(123);
?>
<img src="<?php echo $file_data['user_name'], "/images/", $file_data['image_name']; ?>" />

不要忘记逃避您的数据。

您不应该使用PHP提供文件。此外,您应该找到一个webhost,它为您提供Apache lighttpd或nginx。在提供静态文件时,Apache的速度并不快。