This is an article about Symfony and Doctrine.
Each version of this article is below.
It is a memorandum because I reviewed the cache area again in the case of using the EC site framework called EC-CUBE.
The origin is that when deleting the cache in Doctrine 1.x, I used
deleteByPrefix to delete by prefix match.But now
deleteByPrefix is UNDEFIND.
The changes around the cache are summarized below.
## Cache Changes - Renamed old AbstractCache to CacheProvider - Dropped the support to the following functions of all cache providers: - CacheProvider::deleteByWildcard - CacheProvider::deleteByRegEx - CacheProvider::deleteByPrefix - CacheProvider::deleteBySuffix - CacheProvider::deleteAll will not remove ALL entries, it will only mark them as invalid - CacheProvider::flushAll will remove ALL entries, namespaced or not - Added support to MemcachedCache - Added support to WincacheCache
deleteByXXX has disappeared across the board.
When using Result Cache, it seems that the ID managed by prefixing cannot be used.
Well, instead of managing IDs, you should manage Cache properly with
You can clear the cache (deleteAll) for each
This time, I would like to explain how to use Result Cache. See below for information on other caches.
Official(English)::doctrine-project — Caching
Configure Symfony to use ResultCache
First of all, it is a setting. The reference is below.
Official::Configuration Reference — Cache Driver
Github::symfony / demo
You can customize it in various ways, but as a sample, I will use the one from Github as it is.
doctrine: orm: auto_generate_proxy_classes: false metadata_cache_driver: type: pool pool: doctrine.system_cache_pool query_cache_driver: type: pool pool: doctrine.system_cache_pool result_cache_driver: type: pool pool: doctrine.result_cache_pool framework: cache: pools: doctrine.result_cache_pool: adapter: cache.app doctrine.system_cache_pool: adapter: cache.system
If you write the above in doctrine.yaml, the setting is completed.
Use Result Cache
Result Cache can cache the result of
DQL query. Related methods are available by creating a
// Case Repository (extends ServiceEntityRepository) $qb = $this->createQueryBuilder('user') ->where('user.id = :id') ->setParameter('id', $userId); $qb->getQuery() ->useResultCache(true, 600, 'UserInfo') ->getResult();
After the DQL query is created with
getQuery(), the related methods will be available.
I am using
useResultCache to store in ResultCache.
There are three arguments, but each explanation is below.
-  Cache driver
- TRUE: use default cache driver
FALSE: Do not use cache
Cache driver specification
-  Cache lifetime
- Default value of the driver if omitted
-  ID
- If omitted, the MD5 hash value is automatically generated
See below for other methods.
This time, I haven’t specified
namespace yet, so a cache without namespace will be created.
deleteAll without specifying
namespace will delete all caches that do not have a namespace.
Delete Result Cache
How to delete ResultCache. There are
Call the driver from DQL query to remove it.
// Case Repository (extends ServiceEntityRepository) $qb = $this->getEntityManager()->createQuery(); $cacheDriver = $qb->getResultCacheDriver(); $cacheDriver->delete('UserInfo');
In the above example, the cache with ID
UserInfo will be deleted. It’s easy.
Now, next is my theme this time, when I want to delete only a specific cache at once.
In the case of doctrine1.x, the ID was prefixed and deleted with
deleteByPrefix() as a prefix match.
That method is no longer available, so manage the cache with
Manage resultCache using namespace
Simply put, you just create a box called namespace. We will store the cache there.
This is convenient when you have multiple projects or want to separate the cache for User, the cache for Admin, etc.
Here is a simple sample.
// Case Repository (extends ServiceEntityRepository) // use ResultCashe in namespace "User" $qb = $this->createQueryBuilder('user') ->where('user.id = :id') ->setParameter('id', $userId) ->getQuery(); $cacheDriver = $qb->getResultCacheDriver(); $cacheDriver->setNamespace('User'); $result = $qb->useResultCache(true, 600, 'UserInfo') ->getResult(); // DeleteAll namespace "User" $qb = $this->getEntityManager()->createQuery(); $cacheDriver = $qb->getResultCacheDriver(); $cacheDriver->setNamespace('User'); $cacheDriver->deleteAll();
Call the cache driver and set namespace for DQL query with
If you execute deleteAll with the above code, the cache group whose namespace is “User” will be deleted.
That’s easy, but I’ve summarized how to use resultCache and how to set namespace.
I think you should see the details from the URL introduced in the text.