PHP - 内存缓存 - HTML 缓存

Posted

技术标签:

【中文标题】PHP - 内存缓存 - HTML 缓存【英文标题】:PHP - Memcache - HTML Caching 【发布时间】:2010-12-13 22:20:03 【问题描述】:

我想创建一个缓存系统,它会绕过一些机制以提高性能。

我有一些例子:

1-) 我有一个每小时更新一次的动态 php 页面。每个用户的页面内容都是相同的。所以在这种情况下,我可以:

a) 创建一个 html 页面,该页面可以每小时生成一次。在这种情况下,我想绕过 PHP,所以应该有一个静态页面,如果数据库更新,将生成一个新的 HTML 文件。我怎样才能做到这一点?我可以创建一个生成 HTML 文件的 crontab 脚本,但这似乎不是一种优雅的方式。

b) 将输出缓存在内存中,因此 Web 服务器将每小时更新一次内容。我想我需要一个用于 Web 服务器的内存缓存模块。有一个非官方的用于lighttpd的memcache模块,但似乎不太稳定,我也听说过一个用于nginx的memcache模块,但不知道这是否可能。这种方式看起来更加优雅和可行,但是如何呢?有任何想法吗? (同样,在这种情况下我想绕过 PHP)

另一个例子是我有一个每小时更新一次的动态 PHP 页面,在该页面中只有用户详细信息部分是完全动态的(因此用户登录或退出并在该部分中查看他/她的状态)

再一次,我怎样才能为这个页面创建一个缓存系统?我认为,如果我能找到第一个示例的解决方案,那么我可以在该部分中使用 AJAX 并使用相同的解决方案。我说的对吗?

编辑:我想,我无法说清楚。我想完全绕过 PHP。 PHP 脚本将每小时运行一次,之后将不再进行 PHP 调用。我想去掉它的开销。

提前致谢,

【问题讨论】:

【参考方案1】:

使用静态 HTML。 只需使用您的输出更新一个静态 HTML 文件。您需要使用每小时一次的 cron 来运行 PHP 脚本来 fopen()fwrite() 到文件。没有必要点击 PHP 来检索页面。只需为该特定页面创建一个 .htaccess mod_rewrite 重定向规则即可维护您当前的 URL 命名。

虽然不是很优雅,但 静态 HTMLgzip 压缩 对我来说更高效 并且会使用更少的带宽.

使用 cron 每小时运行 PHP 脚本的示例:

// run this command in your console to open the editor
crontab -e

输入这些值:

01 * * * * php -f /path/to/staticHtmlCreater.php > /dev/null

最后一部分确保您不会有任何输出。该 cron 将在每小时的第一分钟运行。

更新

要么我错过了有关您的动态用户个人资料信息的部分,要么它是在我最初发表评论后添加的。如果您只使用单个服务器,我建议您切换到 APC,它提供操作码缓存和比 memcached 更快的缓存机制(对于单个服务器应用程序)。如果用户的个人资料数据在首屏(在用户的窗口视图之下),您可能会等待发出 AJAX 请求,直到用户向下滚动到指定点。您可以在 facebook 状态页面上查看此功能。

【讨论】:

这没有解决第二个例子;使用 AJAX 的建议通过将 PHP(此时不可避免)的“开销”(天哪,毫秒被浪费了,人们!)与由 javascript 提供支持的第二个请求混合在一起,使事情变得复杂,这会导致更多的开销被引入方程。让 PHP 解析静态文件可能会很好,但是来自某种内存缓存设备的 PHP 会更好。你在一个请求中可以做的任何事情都可能比启动 AJAX 更好;即使是 iFrame 也会更好——这不是 AJAX 应有的用途。 是的,你对 AJAX 的看法是对的,但至少页面会渲染得非常快,此时用户详细信息部分并不重要。它可以在 1 秒后出现。谢谢,【参考方案2】:

如果这只是一个单一的网络服务器,你可以只使用 PHP 的 APC 模块来缓存页面的内容。它并不是真正设计用于缓存整个页面,但它应该在紧要关头完成。

编辑:我忘了提到 APC(还没有)随 PHP 一起提供,但可以从 PECL 安装。它将作为 PHP 6 的一部分提供。

【讨论】:

这个,或者 memcached,让 PHP 检索你需要的任何值。此外,可能没有必要将 AJAX 引入用户数据的图片中,除非这需要完全性感和动态; PHP 实际上对字符串非常好,所以只需加载页面的静态部分并输入用户特定的数据应该很容易。 感谢您的快速回复。我已经在使用 memcached 一个操作码缓存系统 xcache。我喜欢他们,但我真的一个小时不使用PHP,数据每小时更新一次。因此,如果可能的话,我想完全绕过 PHP。它将每小时运行一次。【参考方案3】:

一个很好的方法是将静态内容存储在一个文件中。事情应该是这样的:

您的 PHP 脚本被调用 如果您的内容文件在 1 小时前被修改(宽度 filemtime($yourFile)) 重新生成内容 + 将其存储在文件中 + 将其发送回客户端 其他 按原样发送文件内容(使用 file($yourFile) 或 echo file_get_contents($yourFile)

在任何情况下都能很好地工作,即使在重负载下也是如此。

【讨论】:

除非文件特别大,此时fpassthru会好很多。见us.php.net/manual/en/function.fpassthru.php 谢谢,但我想完全绕过 PHP。我不想使用 PHP 并消除它的开销。这就是问题所在。 然后一个 crontab 是要走的路,调用一个脚本来生成你的 HTML 文件,例如每小时。

以上是关于PHP - 内存缓存 - HTML 缓存的主要内容,如果未能解决你的问题,请参考以下文章

PHP网页缓存技术

组合缓存方法 - 基于内存缓存/磁盘

静态缓存

PHP缓存技术

PHP网页缓存技术

PHP 内存缓存问题