我现在有一个非常复杂的index.php
,我想每小时只运行一次。实现这一目标的最佳方法是什么?我有一些想法
apc_store($page, 60*60*)
把它放在APC中 - 我觉得这不是APC的用途,可能会对我网站的其他部分做些坏事答案 0 :(得分:3)
当下一个访问者到来时,首先查找已保存的文件,如果存在,请提供该文件,而不是执行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很适合缓存在需要时重新生成页面的代码,如果我们讨论的是一个小型(ish)应用程序,那么memcached绝对有点过分。
答案 1 :(得分:1)
提供静态页面始终是最优化的方式。因此,例如使用Cron或您选择的任何其他计划服务,每小时生成一次索引的静态版本,并将其写入文件,例如index.html。如果您仍然需要索引上的一些动态部分,您甚至可以将其生成为.php。
我想说这是绝对最好的方式。当然,处理文件的chmod设置会有一些小麻烦,但这不是一个大问题。
答案 2 :(得分:1)
我在Rowlf和jamietelin上略有不同 答案。
创建3个文件:
<强>的index.html 强>
<meta http-equiv="refresh" content="0;url=/index_update.php" />
<强>的index.php 强>
<?php // do all your normal stuff ?>
<强> index_update.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: /");
然后是一个cronjob:
*/15 * * * * curl http://example.com/index_update.php
因此,如果有人在生产推送后偶然发现页面,他们会透明地为您创建一个新的index.html,否则,您的cronjob将每隔15分钟创建一次。
确保您的apache服务器可以写入 index.html 。如果这听起来很可怕,那么只需让你的cronjob运行php index_update.php
作为另一个用户写入权限 index.html 。但是,您无法访问所有apache环境。
希望这有帮助,欢迎提出意见。
答案 3 :(得分:0)
另一个不错的选择是设置Squid Cache Server。
答案 4 :(得分:0)
将页面保存到静态文件中,并使用.htaccess规则来提供静态页面。
我不确定具体细节,但我认为codeignitor和drupal的提升会做到这一点。