在PHP中进行服务器端输出缓存的最佳方法是什么?
我现在有一个非常复杂的在PHP中进行服务器端输出缓存的最佳方法是什么?,php,apache,caching,indexing,apc,Php,Apache,Caching,Indexing,Apc,我现在有一个非常复杂的index.php,我只想每小时运行一次。实现这一目标的最佳方式是什么?我有一些想法 用APC商店($page,60*60*)将其放入APC中——我觉得这不是APC的目的,可能会对我网站的其他部分造成不良影响 将输出保存到某个文件系统中—然后apache需要在某个地方进行写访问,这可能会很麻烦 不知何故设置apache为我做缓存-这可能吗 您真的应该看看(卓越的支持) 另一个好的选择是设置一个。交付静态页面始终是最优化的方式。因此,使用Cron或您选择的任何其他计划服务,
index.php
,我只想每小时运行一次。实现这一目标的最佳方式是什么?我有一些想法
- 用APC商店($page,60*60*)将其放入APC中——我觉得这不是APC的目的,可能会对我网站的其他部分造成不良影响
- 将输出保存到某个文件系统中—然后apache需要在某个地方进行写访问,这可能会很麻烦
- 不知何故设置apache为我做缓存-这可能吗
另一个好的选择是设置一个。交付静态页面始终是最优化的方式。因此,使用Cron或您选择的任何其他计划服务,每小时生成一次索引的静态版本,并将其写入一个文件example index.html。如果索引中还需要一些动态部分,甚至可以让它生成为.php
我认为这绝对是最好的办法。当然,处理文件的chmod设置会有一些小麻烦,但这不是什么大问题。将页面保存到静态文件中,然后使用.htaccess规则提供静态页面 我不确定具体细节,但我认为drupal的Codeignator和boost可以做到这一点
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);
不过,要回答这个深层次的哲学问题,如果您不想依赖第三方缓存解决方案,将生成的输出保存到单独的文件中可能是最好的方法。APC很适合缓存代码,以便在需要时重新生成页面,如果我们谈论的是一个小型(ish)应用程序,那么memcached肯定是杀伤力过大了。我对Rowlf和jamietelin的应用程序做了一点改动 回答 创建3个文件: index.html
<meta http-equiv="refresh" content="0;url=/index_update.php" />
因此,如果有人在产品推送后在页面上绊倒,他们将透明地为您创建一个新的index.html,否则,您的cronjob将每15分钟创建一次
只需确保apache服务器可以写入index.html。如果这听起来很吓人,那就让你的cronjob作为另一个拥有index.html写入权限的用户运行php index_update.php
。但是,您将无法访问所有apache环境
希望这有帮助,欢迎评论。我已经看到APC正是用于此,我不认为这是坏的。两者都需要额外的依赖性。对于这个用例,我不知道是否有必要…谢谢。为什么磁盘存储比APC好?我不会说一个比另一个好,我会将它们用于不同的目的。当您有一个复杂的应用程序并且需要:1)加快PHP的速度时,APC是很好的;2) 缓存一些生成代价高昂的用户值。例如,我不知道系统上所有可用文件的列表,用于_autoload()函数或任何其他变量,这些变量占用大量资源进行构造,并且不是特定于用户的,因此您可以安全地缓存它。我不会在APC中丢弃生成的页面输出,这不是它的用途。谢谢。将其放入APC的确切缺点是什么?我不需要摆弄文件权限,也不会有任何东西弄乱我的磁盘(只在内存存储中)。我只是不明白在APC中放置HTML代码的意义。APC是PHP的一个操作码缓存,它不会比从磁盘中包含文件更快地为您的预生成HTML提供服务——它没有什么可以加快的,因为(我假设)生成的输出中没有PHP。在你的问题中,你说“我觉得这不是APC的目的”。这也是我的感受:)。我在这方面做了一些细微的改变。我投了你一票,接受了我的回答。希望这是一个很好的妥协:)
<?php // do all your normal stuff ?>
<?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