2012-04-19 16 views
1

現在、Zend_Cache_Backend_Staticを使用してページを静的なHTMLファイルにキャッシュするアプリケーションを実行しています。不正なURLが要求されたときに、何百もの空のファイルとフォルダがキャッシュに入れられることを除けば、これは本当にうまく動作します。例外がスローされた場合にページがキャッシュされないようにする方法はありますか?私はこれが標準的な振る舞いではないことに驚きました。私は少し掘り、実際に静的なHTMLページを保存を扱うZFコードをやったZend_Cache_Backend_Staticを使用しているときのエラーページのキャッシュを防止する

はZend_Cache_Frontend_Captureで、次のとおりです。

public function _flush($data) {   
    $id = array_pop($this->_idStack); 
    if ($id === null) { 
     Zend_Cache::throwException('use of _flush() without a start()'); 
    } 
    if ($this->_extension) { 
     $this->save(serialize(array($data, $this->_extension)), $id, $this->_tags); 
    } else { 
     $this->save($data, $id, $this->_tags); 
    } 
    return $data; 
} 

この機能ははob_startためoutput_callbackです。ステータスをテストするためにレスポンスオブジェクトを取得しようとしましたが、_flushの内部では動作しません。

$response = Zend_Controller_Front::getInstance()->getResponse(); 

if($response->getStatus() == '200') { 
    // do the save as normal 
} 
else { 
    // do nothing 
    return false; 
} 

私の唯一の他の思想は、($データ)strlenをする場合にのみキャッシュ、$データの長さを試験することであった> 0動作しているようですが、それは十分に強力な感じがしません。

アップデート:私たちは、静的なページがすでにキャッシュに書き込まれているので、その時点でキャッシュを無効にすると動作しませんのErrorControllerを襲った時点で残念ながら

。しかし、$ _SERVER ['REQUEST_URI']に基づいてページを削除することは可能です。これは、ページが最初に書き込まれたときにIDとして使用されるものです。

$this->_helper->cache->removePage($_SERVER['REQUEST_URI'], true); 

それはうまく動作しますが、私は最初の場所でページを書くために希望されない:この行はのErrorControllerにerrorActionというの先頭に追加することができます!

答えて

-1

標準ErrorControllerを使用して404,400、および未処理の例外を処理し、そこからキャッシュオブジェクトへの参照を取得できる場合は、エラーハンドラからのキャッシュを無効にできます。エラーコントローラ(またはどこからキャッシュをキャンセルしたいと思います)で

、試してみてください。

$cache->setOption('caching', false); 

Zend_Cache_Coresave() metodがZend_Cache_Frontend_Capture::_flush()によって呼び出されると、それはcachingオプションがfalseに設定されて表示されます実際にはデータをキャッシュに保存せずtrueを返します。さらなる実験から

+0

ErrorControllerを押すまでに、静的ページはすでに書き込まれているので、これは効果がありません。 – baseten

+0

その場合、 'routeShutdown()'で実行されるプラグインは、キャッシングを無効にするには早いほど早いでしょうが、その時点でページが404であることを知るべきです。 – drew010

+0

良いアイデア。私はそれに行くだろう... – baseten

2

問題が404エラー(すなわち。Zend_Controller_Plugin_ErrorHandler :: EXCEPTION_NO_ROUTE、Zend_Controller_Plugin_ErrorHandler :: EXCEPTION_NO_CONTROLLER、Zend_Controller_Plugin_ErrorHandler :: EXCEPTION_NO_ACTION)を引き起こす標準Zend Frameworkの例外ではなく、私のカスタム例外にダウンしていません。 Zend_Cache_Backend_Staticがアクションコントローラのinitメソッドで初期化される必要があるので、今これは本当に明白です。ルート、コントローラー、またはアクションがない状況では、それは決して初期化されません。

ユーザーが存在しない記事を検索している可能性がある既存の操作に例外がスローされています。したがって、initでキャッシュが有効になっており、フロントコントローラープラグインでpostDispatchを押した時点でページが書き込まれています(それがなぜか分かりません)。その時点でキャンセルできません。 1つの解決方法は、例外をスローする時点でキャッシュを取り消すことです。静的ページキャッシングを管理する標準的な方法は、Zend_Controller_Action_Helper_Cacheアクションヘルパーを使用することです。私のアクションコントローラは、次のようになります

<?php 

class Zend_Controller_Action_Helper_PageCache extends Zend_Controller_Action_Helper_Cache { 

    public function cancel() { 
     $cache = $this->getCache(Zend_Cache_Manager::PAGECACHE); 
     $cache->setOption('caching', false); 
     $cache->getBackend('disable_caching', true); 
    } 
} 

: -

<?php 

class IndexController extends Zend_Controller_Action { 

    private $_model; 

    public function init() {   
     $this->_model = new Model(); 

     // using extended pageCache rather than $this->_helper->cache: 
     $this->_helper->pageCache(array('index'), array('indexaction')); 
    } 

    public function indexAction() { 
     $alias = $this->_request->getParam('article'); 
     $article = $this->_model->getArticleByAlias($alias); 

     if(!$article) { 
      // new cancel method will disable caching 
      $this->_helper->pageCache->cancel(); 
      throw new Zend_Controller_Action_Exception('Invalid article alias', 404); 
     } 

     $this->view->article = $article; 
    } 
} 
0

あなたはオプションでfilesizesを確認するためにあなたの.htaccessファイルのRewriteRulesを変更する必要があります私はそうのようにキャンセルメソッドを追加するために、これを拡張しましたs

このようにして、ページがキャッシュされている(したがって0バイトのファイルを生成している)ときにエラーが発生した場合、キャッシュに永続的に格納されることはありません。

関連する問題