【问题标题】:PHP script to display images is slow显示图像的 PHP 脚本很慢
【发布时间】:2012-04-12 22:24:16
【问题描述】:

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

photogallery.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. 如何加快速度?有没有一种安全的方法来缓存图像?我相信 Gallery 2 会以某种方式做到这一点。

【问题讨论】:

    标签: php image readfile


    【解决方案1】:
    1. 是的,您的方法增加了时间,通过将图像置于循环之外,您强制 PHP 将每个图像缓冲到内存中,然后将其发送给用户,从而增加服务器的负载并为 LARGE图片(假设这里是画廊)。

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

    参考资料:

    【讨论】:

    • 我知道如何防止盗链。但这并不妨碍用户直接输入网址并查看照片。
    • @haudenschilt,您的意思是directory listing 还是通过知道其网址直接拉出照片?我提到过使用 htaccess 来验证用户的会话(登录权限)
    • 实际上都是。我不知道如何防止使用 htaccess 通过 url 直接提取照片。我过去曾查过,但找不到任何东西,所以我认为这是不可能的。
    • 我更新了我的参考评论以包含 protecting directories with htaccess,这应该会让你顺利上路。
    • 明确一点...我的用户名/密码信息存储在数据库中。为了执行 .htaccess 方法,我必须将该信息从 db 移动到 .htpasswd 文件?
    【解决方案2】:

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

    【讨论】:

    • 由于我已将照片移到网络根目录之外,因此无法直接提供图片。
    【解决方案3】:

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

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

    【讨论】:

    • 我尝试删除 getimagesize() 并且几乎没有什么不同。从一致的 600 毫秒更改为 550 毫秒。这些图像的正常显示时间更像是 100 毫秒或更短。
    • 也许尝试在几个函数之间回显页面加载时间,看看它在哪里阻塞。 phpjabbers.com/measuring-php-page-load-time-php17.html
    • 我试过了,整个脚本在不到一毫秒的时间内执行完毕。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 你没有回答 OP 的问题:问题是为什么脚本很慢,而不是显示图像的替代方法。
      猜你喜欢
      • 2011-08-28
      • 2011-10-21
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多