新規文書の登録時だけブロックキャッシュをクリアする

当サイトはそれほど更新頻度が高くないので、トップページのブロックなんかはずっとキャッシュしておいて、新しい文書が登録されたときにだけクリアすればよいのです。

というわけで、文書モジュール(docsという名前で複製したpicoモジュール)を対象にその仕組みを作りました。こんな感じです。

class Docs_XxxPreload extends XCube_ActionFilter {
  function 
preBlockFilter() {
    
$this->mRoot->mDelegateManager->add'ModuleClass.Pico.Contentman.InsertSuccess' , array( &$this 'clearCaches' ) ) ;
  }

  function 
clearCaches$mydirname $content_id $cat_data $ret_uri4html ) {

    
$db $this->mController->mDB;

    
$sql 'SELECT bid FROM '.$db->prefix('newblocks')."
    WHERE  visible =1
    AND  dirname =  'docs'"
;
    
$ret $db->query($sql);
    while( list(
$bid) = $db->fetchRow($ret) ) {
      if(
$handler opendir(XOOPS_CACHE_PATH)) {
        while((
$file readdir($handler)) !== false) {
          if(
preg_match('/'.urlencode(XOOPS_URL).'_bid'.$bid.'_'."\w+\.cache\.html$/"$file$matches)) {
            @
unlink(XOOPS_CACHE_PATH "/" $matches[0]);
          }
        }
        
closedir($handler);
      }
    }
  }
}

SQL文のところは、XoopsBlockとかを作って云々するのが正しい作法だと思いますが面倒なので直打ちで。docsモジュールで実際に使われているブロックのIDを取得しています。

XCLでは一つのブロックに対して、アクセスできるユーザーグループ単位で(なのかな、このあたりは調べが及んでいませんが、とにかく)複数のキャッシュが作られます。それらをすべて削除しています。外側のwhile文の中はstdCacheモジュールのソースを参考にしました。

ちなみに、ブロックIDからその(ゲストユーザー向けの)キャッシュファイル名を取り出す方法はこんな感じでした。

$block = new XoopsBlock($bid);
$blockProc = new Legacy_BlockProcedure($block);
$cacheInfo $blockProc->createCacheInfo();
$cacheInfo->mGroupArr = array(XOOPS_GROUP_ANONYMOUS);
$cacheFilePath $cacheInfo->getCacheFilePath();

友達に伝える
タグ: XOOPS pico
作成: 2013/9/23 by:koji
更新: 2013/9/24 by:koji


XOOPS Cube Legacy cheat sheet

Tech

サーバから送信するWebページを圧縮する

新規ユーザー登録(無料)

  • メールニュース[週刊起-動線]の購読
  • コメントなどの投稿
  • ココロミの利用
  • 一部コンテンツの購読

ログイン

コメント

タグ(キーワード)