【问题标题】:How to avoid loading user's logo every time如何避免每次都加载用户的徽标
【发布时间】:2014-01-13 09:43:48
【问题描述】:

我的网站有很多图片,例如用户的徽标、产品的徽标/图片或公司的徽标/图片。

现在,我将这些徽标或图像名称存储在 MySQL 中。如果我想知道一个用户的标志,我必须查询mysql,找到标志。就像这样:

<img src="{{FileManager::getFile('user_logo',$loop->photo)}}" />

问题是,我的网站正在发展并变得越来越大。假设,我有一个页面,它将显示用户信息(用户名、用户年龄...用户徽标)。
我必须查询 MySQL 才能找到他们的徽标。每次,这将花费大量时间等待页面加载用户的徽标。我想知道如何加快加载徽标/图像的速度?

我正在使用 Laravel 4 和这个服务器规范:

  • 阿帕奇
  • PHP 5.4
  • MySQL 5.5
  • Redis 2.6

【问题讨论】:

  • "现在,我将这些徽标或图像 name 存储在 mysql 中,..."
  • @JoachimIsaksson 是的,只是将图像名称存储在 mysql 中,文件本身存储在文件系统中。
  • 看起来缓存没有启用/在图像上运行良好,至少之前应该下载 200 个,不是吗?如果您使用 md5 命名图像,您应该能够将缓存设置为永不过期图像,因为它永远不会在不更改文件名的情况下更改。
  • @JoachimIsaksson 谢谢,我不太熟悉如何在应用服务器上打开或配置缓存。哦,我正在使用 apache。
  • @diligent 试试看here。仅为更改内容的图像设置较长的缓存时间(例如,如果更改内容,则更改名称的 md5 文件非常适合永久缓存),但即使是 10 分钟的超时也对图像有很大帮助包含在每个/许多页面加载中。

标签: php html image web storage


【解决方案1】:

想法

最好的方法是根据用户 ID 将徽标图像存储在服务器层次结构中。因此,您无需查询图像,因为您知道获取图像的所有信息:

  • 图片位置:将是一个修复文件夹。
  • 图像名称:用户 ID。

例如,您可以创建一个image 目录,您可以在其中保存文件名与用户 ID 匹配的所有徽标。通过这种方式,您可以通过example.com/images/{userid} 等简单的 URL 轻松获取用户徽标。

如果这不适合您的目录结构,请重新构建它。例如,您可以为每个用户创建一个文件夹,在其中保存他们的图片,名称为 logo1logo2 等,或者简单地将其放入子文件夹中。您可以通过 example.com/images/{userid}/logo1example.com/images/{userid}/logos/1 等 URL 获取这些信息。

实施指南

以下是服务器端的一些实施指南:

用户的个人资料页面

  1. 从 URL 中获取用户 ID。就像来自 URL example example.com/users/150 的 ID 150
  2. 验证它。
  3. 加载标志如:&lt;img src="example.com/images/150/logos/1" alt="Logo"&gt;

用户列表页面

  1. 查询所有用户,例如:SELECT id, name FROM users WHERE id &gt; 50
  2. 使用用户 ID 呈现包含图像的列表。

列表的示例循环:

foreach ($users as $user) {
    echo $user->name;
    echo '<br>';
    echo '<img src="example.com/images/' . $user->id . '/logos/1" alt="Logo">';
}

所有其他列表

与用户的列表实现相同,只需确保您存储或加入用户,以便您可以再次从一个查询中获取 id。

【讨论】:

  • 感谢 totymedli,现在就这样做吧。在我的服务器上,每当我需要加载一个用户的登录信息时,我都会创建一个文件夹来存储所有图像或徽标。首先我阅读 mysql,获取用户徽标的名称,然后从我将用户徽标放在服务器上的路径中找到。最后,我得到了标志的全名。尽管在这种情况下,页面仍然会花费大量时间来加载徽标。
【解决方案2】:

将图像存储在 cookie 中。

if(!isset($_COOKIE['imgCookie']))
{
    //runs if the user doesn't have the cookie
    //run randomizer code
    //setcookie('imgCookie',$imageNumber);
} else {
    //runs if the user already has the cookie
    $imagenumber=$_COOKIE['imgCookie'];
}
//run code for sending image to user

您还可以通过在标题中指定缓存持续时间来指示用户的浏览器将您的页面缓存很长时间(最长一年,如下所示):

header('Cache-Control: max-age=31556926');

Source

【讨论】:

  • 如果用户改变了他的标志,我需要重写cookie吗?或者,我需要重写缓存吗?如果是,则每次加载图片时,我都必须测试这些图片是否已更改。
  • 类似的,但你也可以在一小段时间后销毁cookie,然后它可以更新。
  • @sergio 抱歉没有提及来源。
【解决方案3】:

我认为徽标不是要保护的信息。

您应该创建一个用户 cookie,在其中存储(例如)用户徽标的 ID。 如果未设置 cookie,则执行查询,加载徽标图像并创建 cookie。

示例

数据库架构:
USER(id, name, blah, ..., logoID)
LOGOS(id、路径、大小、等等等等)
USER2LOGO(idUser, idLogo)

您将这对夫妇 (id,idlogo) 存储在客户端 cookie 中。 如果它存在于 USER2LOGO 中,则加载它,否则执行查询

【讨论】:

  • 我用md5加密logo的名字,然后把这个名字存到mysql,够吗?
猜你喜欢
  • 2021-12-16
  • 2023-03-22
  • 2019-06-27
  • 2017-02-19
  • 2021-05-19
  • 1970-01-01
  • 2023-02-25
  • 2020-08-25
  • 1970-01-01
相关资源
最近更新 更多