$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);
答案 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的速度并不快。