2

所以我有一个需要登录才能查看的网站,它有一个照片库。为了保护这些照片,我将它们移到了 Web 根目录之外,并使用 php 脚本来显示它们。像这样的东西。

照片画廊.php

echo '<img src="photo.php?id=X"/>';

照片.php

$id = (int)$_GET['id'];

$photo = getPhotoDataFromDb($id);
$path  = DIRECTORY.basename($photo['filename']);

// Make sure photo file exists
if (!file_exists($path) || !is_file($path))
{
    logError(__FILE__.' ['.__LINE__.'] No photo found in directory ['.$path.'] for photo id ['.$id.'].');
    header('HTTP/1.0 404 Not Found');
    return;
}

$info = getimagesize($path);

header("Cache-control: public, no-cache;");
header("Content-type: ".$info['mime']);

readfile($path);

一切正常,除了这比从网络根目录中正常显示照片慢67倍。

所以,我的问题是:

  1. 我的代码有问题吗,还是这种方法总是会增加更多时间?
  2. 我怎样才能加快速度?有没有一种安全的方法来缓存图像?我相信画廊 2 会以某种方式做到这一点。
4

5 回答 5

4
  1. 是的,您的方法增加了时间,通过将图像置于循环之外,您强制 PHP 将每个图像缓冲到内存中,然后将其发送给用户,从而增加服务器上的负载并为 LARGE 图像创建明显的延迟(假设此处为画廊) .

  2. 您可以通过将图像放在网站/应用程序的根目录中来加快速度。要保护您的图像免受远程盗链,只需使用htaccess脚本(谷歌)。您还可以创建组合htaccess和登录权限,以防止未经批准的用户进入包含图像的文件夹。

参考:

于 2012-04-12T13:31:48.573 回答
1

图像应直接以文件形式提供,而不是通过 readfile 提供。

于 2012-04-12T13:13:40.737 回答
1

在很多情况下 getimagesize(); 需要很长时间。尽量避免它,并注意是否有任何速度差异。

这种情况最常发生在远程图像中,因此不能完全确定您是否遇到了同样的问题。

于 2012-04-12T13:17:01.607 回答
1

看看https://tn123.org/mod_xsendfile/

我发现 sendfile 比直接在代码中返回文件要快一些。

于 2012-04-12T13:32:42.613 回答
-1

尝试使用 jquery 插件或 javascript 图库代码来显示照片而不是 php。PHP 是一种服务器端语言,所以它必须联系服务器来获取新图像,这可能会降低网站速度。

于 2012-04-12T14:19:15.680 回答