在 PHP 中进行服务器端输出缓存的最佳方法是什么?
题
我有一个相当复杂的 index.php
现在,我只想每小时运行一次。实现这一目标的最佳方法是什么?我曾经有过的一些想法
- 将其放入 APC 中
apc_store($page, 60*60*)
- 我觉得这不是 APC 的用途,并且可能会对我网站的其他部分造成不良影响 - 将输出保存到文件系统的某个地方 - 然后 apache 需要某个地方的写访问权限,这可能会很痛苦
- 以某种方式设置 apache 来为我进行缓存 - 这可能吗?
解决方案 3
我对Rowlf和Jamietelin的答案有微小的变化。
创建3个文件:
索引.html
<meta http-equiv="refresh" content="0;url=/index_update.php" />
索引.php
<?php // do all your normal stuff ?>
索引更新.php
<?php
$file = "index.html";
$time = 60 * 10 - (time() - filemtime($file));
# this is on the first install
if (filemtime($file) != filectime($file))
$time = 0;
if ($time > 0) {
die("Data was already updated in the 10 minutes. Please wait another " . ($time) . " seconds.");
}
ob_start();
require "index.php";
$data = ob_get_contents();
$fp = fopen($file, "w");
fwrite($fp, $data);
fclose($fp);
header("Location: /");
然后是一个定时任务:
*/15 * * * * curl http://example.com/index_update.php
因此,如果有人在生产推送后偶然发现该页面,他们将透明地为您创建一个新的 index.html,否则,您的 cronjob 将每 15 分钟执行一次。
只要确保 索引.html 可由您的 apache 服务器写入。如果这听起来很可怕,那么就让你的 cronjob 运行吧 php index_update.php
作为具有写入权限的另一个用户 索引.html. 。但您无法访问所有 apache 环境。
希望这对您有所帮助,欢迎评论。
其他提示
- 当访问者访问您的页面时,生成内容,将其发送给用户并将静态文件保存在磁盘上的某个位置。
当下一个访问者到来时,首先查找已保存的文件,如果存在,则提供该文件,而不是执行 index.php 文件中的所有代码。一个基本的例子是
if (file_exists($cacheFileName)) { require $cacheFileName; exit; } // here goes the rest of your index.php code //.. // assuming your output is buffered and is contained in $output: echo $output; $cacheFileName = '/path/to/your/file.inc'; file_put_contents($cacheFileName, $output);
设置一个CRON作业,该作业将每小时或经常从磁盘中删除保存的高速缓存文件。或者,在您的index.php中,在每个页面上单击检查缓存文件创建的时间,如果它的存在时间比您希望的时间长,则生成一个新的缓存文件。不过 cron 作业更容易设置。
不过,为了回答深层的哲学问题,如果您不想依赖第三方缓存解决方案,则将生成的输出保存到磁盘的单独文件中可能是最好的方法。APC 非常适合缓存需要时重新生成页面的代码,而如果我们谈论的是小型应用程序,memcached 绝对是大材小用。
提供静态页面始终是最优化的方式。因此,使用 Cron 或您选择的任何其他计划服务,每小时生成一次索引的静态版本,并将其写入文件,例如 index.html。如果您仍然需要索引上的一些动态部分,您甚至可以将其生成为 .php。
我想说这绝对是最好的方法。当然,处理文件的 chmod 设置会有些小麻烦,但这并不是什么大问题。
将页面保存到静态文件中并使用 .htaccess 规则来提供静态页面。
我不确定具体细节,但我认为 drupal 的 codeignitor 和 boost 可以做到这一点。