【问题标题】:Symfony2 - How to set Doctrine APC cache prefix with multiple appsSymfony2 - 如何为多个应用程序设置 Doctrine APC 缓存前缀
【发布时间】:2015-04-01 05:58:53
【问题描述】:

更新:见帖子底部 (这最初是在我们使用 SF 2.3 时发布的,我们现在使用的是 2.7.0)

我们的服务器上运行了多个 Symfony 应用程序,但由于所有原则性 ORM 缓存条目都以“sf2”为前缀,因此我们似乎在站点之间受到了缓存污染。

从过去 30 分钟的谷歌搜索来看,似乎没有一个简单的解决方案。

第一个建议使用 ProjectConfiguration.class.php - 但这似乎是 Symfony 1 的事情。

下一个可能的解决方案是使用 ApcUniversalClassLoader 类(根据 SO 上的这个问题:Multiple Symfony2 Sites using APC Cache)。

问题是我们的设置使用 composer 来自动加载,所以我们不能简单地使用该示例中的代码。

APC的类缓存端没问题,可以在前端控制器设置key,但是没有设置doctrine缓存的key。

有没有人有任何想法,因为目前我们不得不在除第一个应用程序之外的所有应用程序上禁用 APC。

前端控制器:

<?php

use Symfony\Component\ClassLoader\ApcClassLoader;
use Symfony\Component\HttpFoundation\Request;

require_once __DIR__.'/../app/bootstrap.php.cache';

// Use APC for autoloading to improve performance.
// Change 'sf2' to a unique prefix in order to prevent cache key    conflicts
// with other applications also using APC.
$loader = new ApcClassLoader('app_1', $loader);
$loader->register(true);

require_once __DIR__.'/../app/AppKernel.php';

$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();

// wrap the default AppKernel with the AppCache one
require_once __DIR__.'/../app/AppCache.php';
$kernel = new AppCache($kernel);

Request::enableHttpMethodParameterOverride();
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

-- 澄清-- 澄清一下,上面的代码引用了类的 APC 缓存,这和上面一样工作,很好。我们似乎无法更改的是原则 ORM APC 条目的默认命名空间,这些似乎是固定的,因此与每个正在运行的实例发生冲突。

-- 更新--

在尝试了 Zerrvox 设置命名空间的建议后,它似乎不起作用,主缓存仍在使用默认命名空间。如果在清除缓存时随机生成它们也不会那么糟糕,但是我的 vagrant box 和 live box 上的默认命名空间是相同的,并且缓存是在单独的盒子上生成的,所以它显然不是随机的。

缓存中 appProdProjectContainer 类中的这些方法仍然引用默认命名空间。

protected function getDoctrineCache_Providers_Doctrine_Orm_DefaultMetadataCacheService()
{
....        
$instance->setNamespace('sf2orm_default_9e755ef08ba52b507455ecd06d0a648985c9593b15aca1522b4725acaaf77ce6');
        return $instance;
}

// Same for...

protected function getDoctrineCache_Providers_Doctrine_Orm_DefaultQueryCacheService   

protected function getDoctrineCache_Providers_Doctrine_Orm_DefaultResultCacheService

【问题讨论】:

    标签: php symfony caching doctrine-orm


    【解决方案1】:

    您没有指定您是在谈论教义 ORM 缓存还是使用 Doctrine Annotations 的注释缓存。

    无论如何,您都可以创建自己的 APC 缓存服务,通过在 Symfony 中像这样 (yml) 定义一个服务来同时使用它

       app.doctrine.apc_cache:
           class: Doctrine\Common\Cache\ApcCache
           calls:
               - [setNamespace, ["app_namespace"]]
    

    -- 更新--

    您是否将定义的服务指定为学说的元数据缓存。 Doctrine bundle配置见配置参考http://symfony.com/doc/current/reference/configuration/doctrine.html#caching-drivers

       doctrine:
           orm:
               metadata_cache_driver:
                   type: service
                   id: app.doctrine.apc_cache
    

    【讨论】:

    • 对不起 - 是的,我的意思是真的,任何 Doctrine 缓存。也就是说,注释是否使用与它们所在文件的路径相关的键进行缓存 - 类似于类缓存的方式?如果是这样,它们已经是唯一的了,因为两个 symfony 安装在不同的目录中。无论如何,我会尝试您的解决方案并在之后更新。感谢您的回复。
    • Zerrvox - 查看更新后的帖子,我无法在评论中发布我需要的内容。
    • 我已经更新了我的答案,包括如何配置学说以使用缓存服务
    • 啊,干杯——不,我没有!出于兴趣,有没有在“运行时”而不是配置时设置它?我们在页面加载时切换数据库,因此我们可以在一个代码安装中运行多个站点,因此如果可能的话,我们可以同时切换或设置缓存。
    • 我猜你可以从容器中获取缓存驱动并调用 setNamespace("dynamic_namespace")。这应该可以,但是如果您不使用不同的源代码,则不需要更改元数据缓存。如果您将其用于其他缓存目的,则可能与更改学说结果缓存相关。
    【解决方案2】:

    它适用于我的情况(Symfony 2.8 - 3.4):

    doctrine_cache:
        providers:
            my_redis:
                type: redis
                namespace: "%prefix%"
                aliases:
                  - redis_cache
    

    其中“命名空间”是在 parameters.yml 中设置的给定应用的前缀

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-15
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 2011-06-14
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多