如何实现 PHP/HTML 缓存

2023-12-06

我读过几本关于实现 php 缓存系统的指南(我的网站是自定义编码的,查询量相当大并且不断增长),包括这个:http://www.snipe.net/2009/03/quick-and-dirty-php-caching/

我完全理解它们,但页面的某些部分无法缓存,最好的方法是什么?


如果您进行大量读取但很少更新,则缓存非常有用。数据库中的数据更改越频繁,缓存系统的问题就越大。缓存确实会给您的代码库增加一定的复杂性,这可能会很难处理。在最坏的情况下,它甚至会减慢您的网站速度。

最重要的问题是:
什么时候必须使缓存失效?它什么时候变得陈旧?在大多数情况下,如果数据库查询返回的行与缓存该页面时的行不同。但你怎么知道呢?你没有(也许有办法,但我想不出任何自动取款机),因为要检查这一点,你可能必须查询结果进行比较。

你可以做什么:

  1. 每次更新数据库的相关部分时清除所有缓存
    如果您的数据库很少更新(每小时、每天、每周),这确实是可能的。但如果变化不断发生,那就毫无用处了。大多数网络项目都是这种情况。

  2. 发生某些事情后清除缓存的项目
    这只适用于不需要立即反映更改的情况(例如,如果存在则无关紧要)不正确一段时间的数据)。在这种情况下,如果某个项目早于 X 分钟,或者发生了超过 Y 的综合浏览量,您只需清除该项目的缓存即可。

  3. 仅清除相关部分
    在这里,您必须弄清楚更新数据库时缓存的哪些部分受到影响。如果做得正确,变化会立即反映出来,同时性能也会提高。

最有可能的是选项 3:你必须找出答案。因此,我们以网络博客的经典案例为例,它由首页、存档页面和每个条目的详细信息页面组成。

更改是通过以下方式引入的:管理面板(条目的 CRUD)和评论

如果条目被编辑或删除,您必须清除缓存:

  • 首页,如果条目是新的
  • 相关存档页面(如果条目是旧的)
  • 条目的详细信息页面

如果有人发表评论,您只需清除详细信息页面,但前提是索引或存档中未显示评论数量。否则,与 Entry-crud 相同。

如果站点范围内的某些内容发生更改,则必须清除整个缓存(糟糕!)

现在,让我们考虑一下条目粗略和存档。如果存档的类型为“每月一页”,则清除该条目所属的月份。但如果存档是条目 1-10、11-20、21-30...,则很可能必须重建整个存档缓存。

等等 ...

一些问题:

  • 如果您没有正确识别所有受影响的部分,则可能会导致过时的数据和/或(未)死链接。

  • 如果更新发生得太频繁,则构建缓存是额外的工作,因为当下一个页面浏览发生时,缓存很可能再次过时,并且无论如何都必须重建。

  • 页面的某些部分不适合缓存,例如(自定义)搜索功能。如果缓存在其他地方工作,一切都会很快而且很棒,但搜索仍然非常慢。

  • 如果在发生大量请求时必须清除整个缓存,这可能会出现问题。然后它可能会阻塞您的服务器,因为缓存未命中通常比页面一开始就没有缓存的代价更高。更糟糕的是,如果有 3 个请求进来,并且第一个请求在处理其他两个请求之前无法缓存页面,则缓存会被请求 3 次而不是一次。

我的建议:

  • 优化您的数据库。按键和配置好吗?也许它可以在没有缓存的情况下工作。

  • 优化您的查询。 “解释选择”!

  • 只缓存页面的一部分——昂贵的部分。使用 str_replace 和占位符填充小的、廉价的更改

  • 如果一切正常,请使用 apc 或 memcached 而不是文件(文件通常效果很好,但 apc/memc 更快)。您还可以使用数据库来缓存数据库,通常效果很好!

  • 您正在构建一个惰性缓存系统还是一个急切的缓存系统?惰性表示:在页面第一次请求时构建缓存,急切表示:在更新后立即构建缓存。

嗯,我没有什么真正的建议给你。太依赖于问题了:)

update

有一个对密钥为 256 的博客条目的请求。它显示了博客条目、评论以及当前登录的用户。查询条目和评论以及格式化所有文本和所有内容的成本很高。当前登录的用户驻留在会话中。

首先,为要缓存的部分创建一个唯一的键。在这种情况下,缓存键可能是条目的数据库 ID(带有一些前缀和后缀)。

所以,缓存文件的名称应该是cache/blogentry_256.tmp。检查该文件是否存在。

  1. 如果不存在,则执行所有昂贵的查询和格式化,在当前用户的名称所在位置保留一个占位符(例如 {username}),并将结果保存到cache/blogentry_256.tmp。请注意,不要将任何不应向每个人显示或根据每个请求进行更改的数据写入此文件。

  2. 现在,读取文件(或重用 1 中的数据)并将用户名 str_replace 到占位符中。echo结果。

如果条目被更改或有人评论,您必须删除带有条目 id 的缓存文件。

这是惰性缓存 - 仅当用户请求页面时才会构建缓存。请小心 - 如果用户在评论中输入 {username},它也会被插入那里!这意味着,您必须转义缓存数据并在 str_replacing 之后取消转义。该技术也适用于 memcached 或 apc。

问题:您必须围绕缓存决策构建您的设计。例如如果你想显示“5分钟前发布的评论”而不是“5月6日下午3:42添加的评论”,那么你就有麻烦了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何实现 PHP/HTML 缓存 的相关文章

  • after_or_equal 验证在 laravel 5.2 中不起作用

    我想比较 start date 和 end date 并且 end date 应等于或大于 start date 我正在使用 after or equal 验证 return Validator make data start date g
  • 无法在 PHP shell_exec() 中运行“cd”命令

    我最近在我的大学以太网连接上安装了 Apache 设置的笔记本电脑 现在 只要我有 IP 地址或主机名 我可以选择 我就可以从任何地方连接到我的计算机 现在我想创建一个基于 Web 的命令提示符 让我可以从任何设备在笔记本电脑上运行命令 一
  • MySQL - 重命名列

    如何重命名 mysql 列help to content在我的桌子上tbl help mysql query ALTER TABLE tbl help CHANGE COLUMN help content 您必须在更改列语句中包含列的定义
  • ios 无法将图片上传到服务器

    您好 我正在尝试将图像从我的 IOS 设备上传到服务器 这是我上传图像的代码 IBAction btnUpload id sender if self imageViewGallery image nil UIAlertView Error
  • 如何在 apache 中访问唯一 ID?

    如何访问 apache 跟踪每个请求的 unique id 我想在它调用的任何 php 脚本中跟踪它 并记录每个请求 我删除了以下行的评论http conf file LoadModule unique id module libexec
  • 超大图像缩小后变得模糊

    这是我第一次尝试响应式设计 所以如果这是一个愚蠢的简单问题 请原谅 我创建了一个图像并将其最大宽度设置为不大于图像的实际宽度 因为我知道放大图像会导致模糊不清 我有点困惑的是 当我缩小窗口并且图像开始缩小时 它也变得模糊 这是正确的行为吗
  • 在 Spring Boot 中重新加载/刷新缓存

    我正在使用 Spring Boot 对于缓存 我使用 Ehcache 到目前为止一切正常 但现在我必须重新加载 刷新 那么我该如何执行此操作 以便我的应用程序不会出现任何停机时间 我在Spring Ehcache中尝试了很多方法 但它不起作
  • 使@lru_cache忽略一些函数参数

    我怎样才能使 functools lru cache https docs python org 3 library functools html functools lru cache装饰器忽略一些与缓存键有关的函数参数 例如 我有一个如
  • Asp.net Mvc OutputCache属性和滑动过期

    Calling http foo home cachetest for UrlRoute Path home cachetest OutputCache Duration 10 VaryByParam none public ActionR
  • Facebook 分享不显示来自开放图元标签的图像

    我正在尝试将 Facebook 共享按钮集成到我雇主的网站 标题 网址 描述 简介均显示正确 但未附加任何图像 当共享对话框打开时 图像容器会闪烁 然后消失 就好像 facebook 正在尝试处理图像但失败一样 我正在使用 og image
  • 为什么边框会增加元素的宽度?

    我有一个div如下 其指定宽度为 300px 边框宽度为 2px 为什么2px边框会导致宽度div是304px 如果我希望它有边框但宽度仍为 300 像素怎么办 test width 300px height auto border 2px
  • 两列宽度可变且它们之间的间隙固定

    我需要动态设置两列的样式 它们各自的宽度应为 50 但它们之间的固定间隙为 10px 当我折叠菜单时 列应加宽至可用空间 并且间隙应保持 10 像素 因此 列不能采用固定宽度 我试过这个 container background red w
  • 如何使用PHP在服务器端缩小图像?

    我有一些从服务器提取的图像 imgUrl保存图像的路径 现在我用 img src width 100 height 200 或 CSS 来缩小图像 但我想在 PHP 中执行此操作 以便将已缩放的图像提供给 DOM 有任何想法吗 Thanks
  • jQuery - 动画可折叠 DIV,向上滑动?

    我使用这个 jQuery 脚本来设置 div 的动画 以便在用户单击按钮时打开 关闭 http www dynamicdrive com dynamicindex17 animatedcollapse htm http www dynami
  • 淡出图像上的文字

    我知道如何使用 CSS 透明渐变淡出纯色背景上的文本 但是如何才能淡出图像背景上的文本呢 这是我想要的一个例子 注意 我需要像图像一样的静态效果 而不是动态过渡 CSS mask image可能是您正在寻找的 div background
  • InvalidArgumentException 与 UnexpectedValueException

    我应该什么时候使用无效参数异常 http www php net manual en class invalidargumentexception php什么时候意外值异常 http www php net manual en class
  • PHP 生成文件供下载然后重定向

    我有一个 PHP 应用程序 它创建一个 CSV 文件 强制使用标头下载该文件 这是代码的相关部分 header Content Type application csv header Content length filesize NewF
  • 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解使用 nea 的正确语法[重复]

    这个问题在这里已经有答案了 我收到这个错误 ERROR ERRORINSERT INTO new comp reg phno fullname address dept desc VALUES 您的 SQL 语法有错误 检查与您的 Mari
  • 打开我网站上的链接不起作用

    在我的网站上 我有一个我正在尝试获取工作的链接 我有一个遵循正常格式的链接 即 href 以 www youtube com 作为目标链接 并在末尾添加 target blank 当我单击该链接时 托管我的网站的网站会显示一条错误消息 当我
  • 删除已从另一个下拉菜单中选择的下拉值

    我在网上搜索了一段时间 但仍然找不到答案 我的网站上有三个下拉菜单 我使用它们来接受用户首选项 以便用户可以控制结果的输出 所以我想知道如果在其中一个下拉列表中选择了该值 是否可以从其他两个下拉列表中取出该值 例如 如果用户在第一个电影中选

随机推荐

  • 退出应用程序会让人不悦吗?

    继续尝试学习 Android 我只是阅读以下 问题 用户是否可以选择终止应用程序 除非我们添加一个菜单选项来杀死它 如果不存在这样的选项 用户如何终止应用程序 答案 Romain Guy 用户不这样做 系统会自动处理此问题 这就是 Acti
  • OpenCV 中的人脸识别

    我试图使用 OpenCV 2 2 来自 Willow Garage 构建一个基本的人脸识别系统 PCA Eigenfaces 我从之前关于人脸识别的许多帖子中了解到 没有标准的开源库可以为您提供所有人脸识别功能 相反 我想知道是否有人使用过
  • 如何在heroku中设置超过30秒的响应超时

    伙计们 如果响应返回时间超过 30 秒 Heroku 将终止请求 那么有什么方法可以让我等待响应返回呢 好吧 用户正在上传他的文件 我需要对服务器中的文件执行一些操作 更新完成后 我将向用户提供下载链接 但服务器处理文件的时间大多超过30秒
  • Rails 5、Heroku 与 Let's Encrypt SSL - 配置设置时遇到问题

    我正在尝试弄清楚如何使用 heroku 上的 Rails 应用程序进行加密 我已经尝试了几个 gem 它们似乎是为帮助完成此过程而设计的 letsencrypt plugin 但删除了这些 gem 推荐的所有安装步骤 因为我无法正常工作 现
  • 矢量填充和调整大小

    我正在研究地图生成器 我使用二维向量来保存数据 Header class MapGenerator public protected std vector lt std vector
  • 防止以编程方式缓存脚本

    我想问一下有没有办法阻止Firefox缓存脚本 js文件 我有一个项目 ASP Net Web App 在 Firefox 上存在缓存问题 当我第一次运行应用程序 脚本正在 Firefox 上缓存 并修改脚本并重新运行应用程序时 Firef
  • 如何获取运行时x:Name值

    I got
  • 如何选择从Excel运行的.NET框架版本?

    除了将 excel exe config 文件添加到 Office Binary 文件夹之外 如何指定 Excel 在运行 NET dll 时使用 NET Framework 版本 2 0 我们的应用程序在 Excel 中运行 并使用 VB
  • mypy可以根据当前对象的类型选择方法返回类型吗?

    在下面的代码中 调用clone 在 A 的实例上调用该方法将返回 A 类型的实例 在 B 的实例上调用该方法将返回 B 类型的实例 依此类推 目的是创建一个与当前实例相同但具有不同的内部生成主键的新实例 因此可以从那里对其进行编辑并安全地另
  • ng-model 作为二维数组中的变量

    p span span p
  • 检查 int 是否为素数 Java

    对 修复我的代码 帖子感到抱歉 编辑 与语法更多相关for循环比质数 现在也解决了 我的任务是从控制台获取一个 int 并打印出 在单独的行上 从 1 到 n 含 的所有素数 我的方法从 n 开始 检查是否为素数 然后将 n 递减 1 并循
  • 事件和自引用组件 vue.js

    我有允许 1 级线程的评论系统 意味着第一级评论看起来像 内容 线 其中线程可能有更多评论 我认为这对于自引用组件和带有插槽的列表很有用 但过了一会儿我不知道如何连接这个东西 SingleComment 组件如下
  • 时间列应使用什么数据类型

    在我的 Spark 应用程序中 我必须拆分时间和数据并将它们存储在单独的列中 如下所示 val df5 df4 withColumn read date date format df4 col date yyyy MM dd withCol
  • 在 R 中安装旧包时出错

    我正在尝试安装 0 6 2 版本的 tm 库 我已经从以下位置下载了 tar gz 文件archive并在 RStudio 中选择 工具 gt 存档 gt 打包存档文件 来安装它 但是 我收到以下错误 有人可以帮我解决这个问题吗 安装sou
  • 如何在 AWS Elastic Beanstalk 上运行 celery Worker?

    版本 姜戈 1 9 8 芹菜 3 1 23 django celery 3 1 17 Python 2 7 我正在尝试在 AWS Elastic Beanstalk 上运行我的 celery 工作线程 我使用 Amazon SQS 作为 c
  • 在头文件中声明一个返回二维数组的函数?

    我试图在我的头文件中声明一个返回二维数组的函数 鉴于我们已经知道数组的大小 如何实现这一点 以下是我目前正在做的事情 class Sample public char x y getArr void blah int x int y pri
  • PowerShell 输出的颜色重定向到文件

    dir颜色输出到文件 如果我在 Ubuntu 上运行以下命令 dharmatech dharmatech 01 tmp pwsh Command dir gt out txt 然后 cat 输出 dharmatech dharmatech
  • 周数和周日

    我有由 date 生成的当年周数和星期几 如下所示 week number date W week day date w 我需要格式化这个 我如何获得本周的开始日期 或者 week number 和 week day 是一个月中的哪一天 U
  • 如何通过最新的 Android 支持库正确使用向后兼容的 Vector Drawable?

    Vector Drawable 不久前已添加到支持库中 从那时起 API 发生了很多变化 Gradle 标志 初始化块 选择器 自定义 XML 属性等 问题是 现在如何正确使用它 在这些情况下支持 lib v25 图像视图 可绘制的文本视图
  • 如何实现 PHP/HTML 缓存

    我读过几本关于实现 php 缓存系统的指南 我的网站是自定义编码的 查询量相当大并且不断增长 包括这个 http www snipe net 2009 03 quick and dirty php caching 我完全理解它们 但页面的某