Php 如何避免每次加载用户的徽标

Php 如何避免每次加载用户的徽标,php,html,image,web,storage,Php,Html,Image,Web,Storage,我有一个网站,有很多图像,如用户的标志,产品的标志/图像或公司的标志/图像 现在,我将这些徽标或图像名称存储在MySQL中。如果我想知道一个用户的logo,我必须查询mysql,并找到logo。就这样, <img src="{{FileManager::getFile('user_logo',$loop->photo)}}" /> 问题是,我的网站越来越大。假设,我有一个页面,显示用户的信息,用户名,年龄。。。用户的标志。 我必须查询MySQL才能找到他们的徽标。每次,这将花

我有一个网站,有很多图像,如用户的标志,产品的标志/图像或公司的标志/图像

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

<img src="{{FileManager::getFile('user_logo',$loop->photo)}}" />
问题是,我的网站越来越大。假设,我有一个页面,显示用户的信息,用户名,年龄。。。用户的标志。 我必须查询MySQL才能找到他们的徽标。每次,这将花费大量的时间等待页面加载用户的标志。我想知道如何加快加载徽标/图像的速度

我将Laravel 4用于此服务器规范:

阿帕奇 PHP5.4 MySQL 5.5 Redis 2.6
将图像存储在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');
想法 最好的方法是根据用户ID在服务器层次结构中存储徽标图像。因此,您不需要查询图像,因为您知道获取图像的一切:

图像位置:将是一个修复文件夹。 图像名称:用户的id。 例如,您可以创建一个图像目录,在该目录中,您可以使用与用户id匹配的文件名保存所有徽标。通过这种方式,您可以通过简单的URL(如example.com/images/{userid})获取用户徽标

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

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

用户个人资料页 从URL获取用户id。类似于URL example.com/users/150中的id 150。 验证它。 加载徽标,如下所示: 用户列表页 查询所有用户,如:选择id,id>50的用户的名称 使用用户ID呈现带有图像的列表。 列表的循环示例:

foreach ($users as $user) {
    echo $user->name;
    echo '<br>';
    echo '<img src="example.com/images/' . $user->id . '/logos/1" alt="Logo">';
}
每隔一个列表
与用户列表实现相同,只需确保存储或加入用户,以便再次从一个查询中获取id。

我假设徽标不是要保护的信息

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

范例

数据库模式:USERid,name,blah,…,logoID 标识id、路径、大小、等等,。。。 USER2LOGOidUser,idLogo

在客户端cookie中存储夫妻id idlogo。
如果它存在于USER2LOGO中,则加载它,否则执行查询

现在,我将这些徽标或图像名称存储在mysql中,…@JoachimIsaksson是的,只将图像名称存储在mysql中,文件本身存储在文件系统中。看起来图像上的缓存未启用/工作正常,至少有一些200的应该是以前下载的,不是吗?如果您使用md5为图像命名,您应该能够将缓存设置为永不过期,因为如果文件名没有更改,它将永远不会更改。@JoachimIsaksson谢谢,我不太熟悉如何在app server上打开或配置缓存。哦,我正在使用apache。请看一看。仅为更改内容而更改名称的图像设置较长的缓存时间(例如,如果更改内容而更改名称的md5'd文件)是永久缓存的最佳选择,但即使是10分钟的超时时间,也会对每个/多个页面加载中包含的图像有很大帮助。如果用户更改其徽标,我需要重写cookie吗?或者,我需要重写缓存吗?如果是,每次加载图像时,我都必须测试这些图像是否已更改。类似于此,但您也可以在一小段时间后销毁cookie,以便在此后更新。@sergio很抱歉没有提及源代码。感谢Tymedli,现在就这样做。在我的服务器上,每当我需要加载一个用户的登录时,我都会创建一个文件夹来存储所有的图像或徽标。首先,我阅读mysql,获取用户的徽标名称,然后从我在服务器上放置用户徽标的路径中找到。最后,我得到了商标的全名。虽然,在这种情况下,页面仍然需要花费大量时间来加载徽标。我正在使用md5加密徽标的名称,并将此名称存储到mysql,这是否足够?