2011-03-10 32 views
0

我有一些意圖在ajax請求中使用的操作。Symfony 1.4:如何獲得使用ajax請求的緩存?

如果我在瀏覽器中查看頁面,則響應會被緩存,因爲它應該是。但是,在Ajax請求它不是。

請求方法是GET,沒有GET參數。

sfViewCacheManager甚至不叫isXMLHttpRequest(),所以它是相當混亂的,爲什麼這是不工作...

是否有設置某處使緩存Ajax請求?

+0

你怎麼知道ajax響應沒有被緩存?你確定這個請求是用GET方法調用的嗎? – 2011-03-10 17:34:48

+0

你是否確定它沒有GET參數?一些JS庫會幫助你爲你添加一個cache-busting參數,即使你沒有爲它們指定參數。我們可以看看你的代碼嗎?另外,例如, Firebug,告訴你關於請求和響應頭文件? – 2011-03-10 21:40:54

+0

在您的操作的緩存配置中,嘗試將with_layout指令更改爲false。我不確定,但如何Ajax響應沒有佈局,這可能是一個問題。 看這個:http://www.symfony-project.org/jobeet/1_4/Doctrine/en/21#chapter_21_action_cache – Curlas 2011-03-11 11:09:05

回答

0

這不是100%的理想,但我想出了一個解決方案。看起來,只有在使用模板時,緩存才能工作。我通過return $this->responseText($json);回覆。

通過最小的PHP模板響應得到緩存運行。

#jsonSuccess.php 
<?php echo $json ?> 

如果有一種方法可以讓responseText觸發緩存機制,因爲它會比運行模板稍微快一點。

有趣的是,緩存現在甚至可以在使用GET查詢參數的情況下工作。我認爲這可能是他們在Symfony 1.3/1.4中啓用的。

爲了說明正在緩存的內容,我在調試模式下查看時爲響應添加了「created_at」頭。

0

POSTGET或其他HTTP頭與頁面一起發送時,Symfony始終禁用緩存。

因此,您的AJAX查詢未被緩存,因爲您正在向要緩存的頁面發送GET參數。

測試的最佳方法是:如您所說,在瀏覽器中添加GET參數和查看頁面,您將看到Cache無法工作。

因此禁用POSTGET或其他Header PUT DEL從Ajax調用和緩存將正常工作。

要禁用Get/Posthttp://www.panteo.net/article/en/1/developpement-symfony-php/cache-symfony-and-appels-ajax.html

1

以下的伎倆,我緩存jQuery的自動完成響應時:

  • 從jQuery腳本中刪除另外的時間戳參數

    取代:

    var extraParams = { 
        timestamp: +new Date() 
    }; 
    

    由:

    var extraParams = {}; 
    
  • 啓用cache.yml緩存,搭配佈局。沒有佈局,似乎沒有什麼工作:

    loginFacility: 
        enabled:  true 
        with_layout: true 
        lifetime: 86400 
    
  • 刪除的動作附註頭,因爲這是自動設置爲「無緩存」:

    $this->getResponse()->setHttpHeader("Pragma", ""); 
    

我的行動現在看起來是這樣的:

public function executeLoginFacility(sfWebRequest $request) 
{ 
    $this->getResponse()->setContentType('application/json'); 
    $this->getResponse()->setHttpHeader("Pragma", ""); 
    $facilities = Doctrine_Core::getTable('Facility')->findLoginFacilitiesForAutocomplete(
     $request->getParameter('q'), 
     $limit); 

    return $this->renderText(json_encode($facilities)); 
} 

現在,做了很多的時候自動完成,響應由Symfony的緩存和Firefox是retri將它們從它自己的緩存中移出。至少,它在Firebug中看起來如何。

我發現將模板添加到混合中而不是從操作返回strait只會導致Symfony緩存中的較大緩存文件。我看不到任何好處。