我是整合了舊的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上顯示錯誤的項目。
我在做什麼錯在這裏?我知道緩存是棘手,但肯定是我在這裏失去了一些東西
我會迴應你在兩邊創建的密鑰,並且在Redis本身的緩存保存之後尋找它們。確切地看到發生了什麼事情,而不是你想象的事情往往是有啓發性的。 –
使用redis-cli進行密鑰*查詢,然後對任意密鑰進行查詢以確定存儲的內容。你在哪裏將商店價值翻譯成對象? – Carlos
@AlisterBulman我已經添加了這樣的信息,但你可以看到,仍然沒有在Symfony方面顯示任何東西 – ReynierPM