用于显示图像的PHP脚本很慢

时间:2012-04-12 13:11:36

标签: php image readfile

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

photogallery.php

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

photo.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);

一切正常,但 6 7 的速度要慢于仅仅通过网络根目录中的目录显示照片。

所以,我的问题是:

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

5 个答案:

答案 0 :(得分:4)

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

  2. 您可以将图片放在网站/应用的根目录中以加快速度。要保护您的图片免受远程热链接的影响,只需使用htaccess脚本(谷歌即可)。您还可以创建htaccess和登录权限的组合,以便将未经批准的用户排除在包含图片的文件夹之外。

  3. 参考文献:

答案 1 :(得分:1)

图像应直接由文件而不是readfile提供。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

我发现sendfile返回文件要快一点,而不是直接在代码中执行。

答案 4 :(得分:0)

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