有什么阻止我在APC中存储Doctrine EntityManager实例?

时间:2011-07-19 22:36:13

标签: php doctrine-orm

嗯......愚蠢的问题。

我知道可以(并且应该)使用Doctrine ORM的APC缓存驱动程序。 但我只是想知道我是否也可以缓存实体管理器实例本身? 是否有任何阻止我这样做的事情:

    $em = apc_fetch('em');
    if(!$em){
        $cache = new Doctrine\Common\Cache\ApcCache;
        $config = new Doctrine\ORM\Configuration;
        $config->setMetadataCacheImpl($cache);
        $config->setQueryCacheImpl($cache);
        $config->setAutoGenerateProxyClasses(TRUE);
        $config->setProxyNamespace('MyProject\Proxies');
        $config->setProxyDir(APP_PATH . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'proxy');
        $driverImpl = $config->newDefaultAnnotationDriver('/path/to/lib/MyProject/Entities');
        $config->setMetadataDriverImpl($driverImpl);
        $connectionOptions = array(
            'driver' => 'pdo_sqlite',
            'path' => 'database.sqlite'
        );
        $em = Doctrine\ORM\EntityManager::create($connectionOptions, $config);
        apc_store('em', $em);
    }

2 个答案:

答案 0 :(得分:2)

您的代码应该可以正常工作。 实际上我们也在我们的项目中缓存EM。节省一些300Kb:)

答案 1 :(得分:0)

我遇到了同样的问题并以这种方式解决了:

$em=unserialize($_SESSION['entityManager']);
$_SESSION['entityManager']=serialize($entityManager);

(实际上,我序列化了一个自行开发的DAOFactory对象,后者又包含了entitymanager)。

这对我来说似乎很好。

BTW:我没有使用APC缓存,因为我希望每个用户都拥有所有DAO的entityManager和DBALConnection对象的独立实例。