代码之家  ›  专栏  ›  技术社区  ›  Paul Tarjan

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

  •  6
  • Paul Tarjan  · 技术社区  · 15 年前

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

    • 把它放进APC apc_store($page, 60*60*) -我觉得这不是APC的目的,可能会对我的网站的其他部分造成不良影响。
    • 将输出保存到某个文件系统中—然后Apache需要对某个地方进行写访问,这可能会很麻烦。
    • 以某种方式设置Apache为我做缓存——这是可能的吗?
    5 回复  |  直到 15 年前
        1
  •  3
  •   Rowlf    15 年前
    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作业更容易设置。

    不过,要回答深层次的哲学问题,如果您不想依赖第三方缓存解决方案,将生成的输出保存到单独的文件中可能是最好的方法。APC很适合缓存需要时会重新生成页面的代码,如果我们谈论的是一个小(ish)应用程序,那么memcached绝对是杀伤力过大的。

        2
  •  1
  •   lejahmie    15 年前

    交付静态页面始终是最优化的方式。因此,例如cron或您选择的任何其他调度服务,可以每小时生成一次索引的静态版本,并让它将其写入一个文件,例如index.html。如果索引上仍然需要一些动态部分,甚至可以让它生成为.php。

    我想说这绝对是最好的方法。当然,处理文件的chmod设置有点小麻烦,但这并不是什么大问题。

        3
  •  1
  •   Paul Tarjan    15 年前

    我去了罗夫和杰米特林的 回答。

    创建3个文件:

    index.html文件

    <meta http-equiv="refresh" content="0;url=/index_update.php" />
    

    索引文件

    <?php // do all your normal stuff ?>
    

    index_update.php(索引更新.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服务器写入。如果这听起来很可怕,那就让你的cronjob运行吧。 php index_update.php 作为另一个具有写入权限的用户 index.html文件 . 但是,您将无法访问所有Apache环境。

    希望有帮助,欢迎评论。

        4
  •  0
  •   cjimti    15 年前

    你真的应该看看 Memcached (优秀) php 支持。)

    另一个好的选择是设置 Squid Cache Server .

        5
  •  0
  •   Benbob    15 年前

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

    我不确定具体细节,但我认为Drupal的共同点火器和Boost可以做到这一点。

    推荐文章
    Matteo Codogno  ·  使用APC和MAMP
    10 年前