我知道可以(并且应该)使用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);
}
答案 0 :(得分:2)
您的代码应该可以正常工作。 实际上我们也在我们的项目中缓存EM。节省一些300Kb:)
答案 1 :(得分:0)
我遇到了同样的问题并以这种方式解决了:
$em=unserialize($_SESSION['entityManager']);
$_SESSION['entityManager']=serialize($entityManager);
(实际上,我序列化了一个自行开发的DAOFactory对象,后者又包含了entitymanager)。
这对我来说似乎很好。
BTW:我没有使用APC缓存,因为我希望每个用户都拥有所有DAO的entityManager和DBALConnection对象的独立实例。