在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可以做到这一点

  • 当访问者访问您的页面时,生成内容,将其发送给用户,并将静态文件保存在磁盘上的某个位置
  • 当下一个访问者到来时,首先查找保存的文件,如果它存在,则提供该文件,而不是执行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肯定是杀伤力过大了。

    我对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