Доступ к элементам кэша, созданным вне Symfony, заставляет их работать только иногда, почему?

я интеграции устаревшее приложение Zend Framework 1 (ZF1) и приложение Symfony 3.2.6 (SF). В двух словах, как это работает:

  • Управление сеансом, страница входа в систему (уникальная точка входа) и многие другие вещи управляются приложением ZF1 и самим ZF1.
  • Нет вызова ни одному контроллеру Zend, шаблонам, помощникам или любому другому со стороны SF

В качестве примера:
http://localhost/login => будет управляться ZF1
http://localhost/sf/quote => будет управляться SF (ключ /sf/ в URL)

Это означает, что у меня есть правило в Apache VH: каждый запрос с /sf/* на URL отправил его app.php|app_dev.php это Symfony, иначе он обойдет это правило и перейдет непосредственно к ZF1.

Имея это первое, что я делаю, это вход в приложение, используя устаревшее приложение ZF1. После успешного входа в систему я перенаправляю на панель NavigationController.php вызывается из main.phtml верстка с использованием следующего кода: $this->action('buildallmenu', 'navigation');,

В таком коде меню генерируется из БД, а затем, используя приведенный ниже код, я пытаюсь его кешировать, поскольку мне это не нужно, и я не хочу снова обращаться к БД из 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.

что я тут не так делаю? Я знаю, что кэширование сложно, но, конечно, я что-то здесь упускаю

2

Решение

Первый раз $menu является null, но это всегда null из-за этого кода: if (!$menu->isHit()) {
return ...
Вы выходите из контроллера с return заявление.

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

return $menu->get();
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]