gpt4 book ai didi

php - 访问在 Symfony 外部创建的缓存项使它们有时只能工作,为什么?

转载 作者:IT王子 更新时间:2023-10-29 06:11:04 25 4
gpt4 key购买 nike

我正在集成一个遗留 Zend Framework 1 (ZF1) 应用程序和一个 Symfony 3.2.6 (SF) 应用程序。简而言之,它是如何工作的:

  • session 管理、登录页面(唯一入口点)和很多东西都由 ZF1 应用程序和 ZF1 本身管理
  • 没有从 SF 端调用任何 Zend Controller 、模板、助手或任何其他

举个例子: - http://localhost/login => 将由 ZF1 管理 - http://localhost/sf/quote => 将由SF管理(关键是URL中的/sf/)

这意味着我在 Apache VH 中有一条规则说:每个在 URL 上带有 /sf/* 的请求都将其发送到 app.php|app_dev.php是 Symfony 否则它将绕过此规则并直接转到 ZF1。

我做的第一件事是使用旧版 ZF1 应用程序登录应用程序。成功登录后,我重定向到仪表板,使用以下代码从 main.phtml 布局调用 NavigationController.php:$this->action(' buildallmenu', '导航');.

在这样的代码中,菜单是从数据库生成的,然后使用下面的代码我试图缓存它,因为我不需要并且我不想再次从 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 Controller 的方式就是我之前解释的方式:“通过访问 URL”。假设我将一个 URL 称为:http://localhost/sf/quote 这将执行规则并重定向到 app_dev.php 这意味着我现在在 Symfony 上。

我做的第一件事是检查 session_id()(打印 session_id() 值)并与 ZF1 创建的值进行比较,它们匹配。

SF 基本模板将 Controller 调用为:{{ 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 上显示了错误的项目。

我在这里做错了什么?我知道缓存很棘手,但我肯定在这里遗漏了一些东西

最佳答案

第一次 $menunull,但它总是 null 因为那个代码:if (!$menu-> isHit()) {
return ...
您使用 return 语句退出 Controller 。

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

return $menu->get();

关于php - 访问在 Symfony 外部创建的缓存项使它们有时只能工作,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42773397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com