2017-03-13 25 views
2

我是整合了舊的Zend Framework 1(ZF1)應用程序和Symfony 3.2.6(SF)應用程序。簡而言之它的工作原理是:訪問在Symfony外部創建的緩存項目使它們有時僅工作,爲什麼?

  • 會話管理,登錄頁面(唯一入口點)和大量的東西是由ZF1應用和ZF1本身
  • 沒有打電話給任何的Zend控制器來管理,模板,助手或從SF側

任何其他作爲一個例子: - http://localhost/login =>將由管理ZF1 - http://localhost/sf/quote =>將SF管理(關鍵是在URL中/sf/

這意味着我有一個規則在阿帕奇VH說:每個請求與/sf/* URL發送到app.php|app_dev.php這是Symfony,否則它將繞過這條規則,它會直接去ZF1。

我做的第一件事就是使用傳統ZF1應用程序在應用程序中登錄。登錄成功後,我重定向到儀表板,使用以下代碼從main.phtml佈局調用NavigationController.php$this->action('buildallmenu', 'navigation');

在這樣的代碼中,菜單從DB生成,然後使用下面的代碼我試圖緩存它,因爲我不需要,我不想再次從ZF1或SF訪問數據庫。

use Predis\Client; 
use Symfony\Component\Cache\Adapter\RedisAdapter; 

$cached_items = [ 
    'main_nav' => $main_nav, 
    'sub_nav' => $sub_nav, 
    'footer_nav' => $footer_nav, 
    'view_as' => $view_as, 
]; 

$redisConnection = new Client('tcp://cache_server:6379'); 
$cache   = new RedisAdapter($redisConnection); 
$menu   = $cache->getItem('mmi_menus_'.session_id()); 

if (!$menu->isHit()) { 
    $menu->set($cached_items); 
    $cache->save($menu); 
} 

return $menu->get(); 

爲什麼session_id()因爲菜單是「獨一無二」每用戶如此有意義的session_id()追加到Redis的緩存項。

從那裏我看到$cached_items var填充了正確的內容並保存到Redis中。

現在我訪問Symfony控制器的方式是我之前解釋的:「通過訪問URL」。比方說,我稱爲URL:http://localhost/sf/quote這將執行規則並重定向到app_dev.php,這意味着我現在在Symfony上。

我做的第一件事是檢查session_id()(打印session_id()值),並與ZF1創建的值進行比較,並且它們匹配。

SF基模板調用控制器爲:{{ render(controller('CommonBundle:Setup:GenerateMenuItems')) }}。這是函數的從模板稱爲內容:

public function GenerateMenuItemsAction() 
{ 
    $menu = $this->get('mmi_pool')->getItem('mmi_menus_'.session_id()); 

    dump('mmi_menus_'.session_id()); 

    if ($menu->isHit()) { 
     return $this->render(
      'CommonBundle:Layout:menu.html.twig', 
      ['menu' => $menu->get()] 
     ); 
    } 

    return new Response(); 
} 

mmi_pool是一種服務,它是確定指標如下:

mmi_pool: 
    parent: cache.adapter.redis 
    tags: 
     - name: cache.pool 
     namespace: '' 

如何緩存配置在config.yml

framework: 
    cache: 
     default_redis_provider: redis://%redis_host%:%redis_port% 

更新

我發現,當我登錄首次不執行這段代碼:

if (!$menu->isHit()) { 
    $menu->set($cached_items); 
    $cache->save($menu); 
} 

我不知道該幹嘛。這導致緩存存儲錯誤的項目,因此在SF上顯示錯誤的項目。

我在做什麼錯在這裏?我知道緩存是棘手,但肯定是我在這裏失去了一些東西

+0

我會迴應你在兩邊創建的密鑰,並且在Redis本身的緩存保存之後尋找它們。確切地看到發生了什麼事情,而不是你想象的事情往往是有啓發性的。 –

+0

使用redis-cli進行密鑰*查詢,然後對任意密鑰進行查詢以確定存儲的內容。你在哪裏將商店價值翻譯成對象? – Carlos

+0

@AlisterBulman我已經添加了這樣的信息,但你可以看到,仍然沒有在Symfony方面顯示任何東西 – ReynierPM

回答

2

第一次$menunull,但它總是null因爲該代碼的:與return聲明if (!$menu->isHit()) { return ...退出控制器。

if (!$menu->isHit()) { 
    $menu->set($cached_items); 
    $cache->save($menu); 
} 

return $menu->get(); 
+0

仍然無法正常工作... – ReynierPM

相關問題