在PHP中进行服务器端输出缓存的最佳方法是什么?

时间:2010-02-05 06:54:02

标签: php apache caching indexing apc

我现在有一个非常复杂的index.php,我想每小时只运行一次。实现这一目标的最佳方法是什么?我有一些想法

  • apc_store($page, 60*60*)把它放在APC中 - 我觉得这不是APC的用途,可能会对我网站的其他部分做些坏事
  • 将输出保存到某个文件系统 - 然后apache需要在某个地方进行写访问可能会很痛苦
  • 以某种方式设置apache为我做缓存 - 这可能吗?

5 个答案:

答案 0 :(得分:3)

  1. 当访问者点击您的页面时,生成内容,将其发送给用户并在磁盘上的某处保存静态文件。
  2. 当下一个访问者到来时,首先查找已保存的文件,如果存在,请提供该文件,而不是执行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);
    
  3. 设置要删除的cron作业 您从磁盘保存的缓存文件 每小时或根据您的需要 至。或者,在index.php中,在每个页面上点击检查缓存文件的创建时间,并生成一个新的缓存文件(如果它已经存在的时间超过了您想要的时间)。虽然cron工作更容易设置。

  4. 要回答深层次的哲学问题,如果您不想依赖第三方缓存解决方案,将生成的输出保存在单独的文件中可能是最好的方法。 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)

您应该真正了解Memcached(优秀php支持。)

另一个不错的选择是设置Squid Cache Server

答案 4 :(得分:0)

将页面保存到静态文件中,并使用.htaccess规则来提供静态页面。

我不确定具体细节,但我认为codeignitor和drupal的提升会做到这一点。