Symfony3:如何以正确的方式启用 PDO/Doctrine 缓存适配器?
Symfony3: How to enable PDO/Doctrine cache adapter, the right way?
喂!
我正在尝试在 Symfony 3.4 中获取缓存适配器 运行。我在这个项目中使用了 doctrine,所以似乎可以使用那个适配器(我在 2 个容器中有这个服务 运行,所以我需要一个缓存系统,这两个容器可以访问......并且有没有 Redis/Memcache...所以请不要对此提出任何建议 ;))。
这里是我做的配置的相关部分:
services:
cache.adapter.pdo:
class: Symfony\Component\Cache\Adapter\PdoAdapter
arguments: [ '@doctrine.dbal.default_connection' ]
blahfu.using.cache:
class: App\HeavyCacheUser
arguments: [ '@app.cache' ]
framework:
cache:
app: cache.adapter.pdo
doctrine:
dbal:
default_connection: default
connections:
default:...
...
我也添加了migration来添加对应的table:
使用以下查询(如 src/Symfony/Component/Cache/Traits/PdoTrait.php
中所示):
CREATE TABLE cache_items (
item_id VARBINARY(255) NOT NULL PRIMARY KEY,
item_data MEDIUMBLOB NOT NULL,
item_lifetime INTEGER UNSIGNED,
item_time INTEGER UNSIGNED NOT NULL
) COLLATE utf8_bin, ENGINE = InnoDB
当我尝试使用它时,我只得到缓存未命中....
示例:
$cacheKey = 'blahfu.bar';
$item = $this->cache->getItem($cacheKey);
if (!$item->isHit()) {
// Do $stuff
$item->set($stuff)->expiresAfter(900);
$this->cache->save($item);
Logger::info('Cache miss');
} else {
Logger::info('Cache hit');
}
return $item->get();
我错过了什么?
感谢您的帮助:)
我找到了如何让它工作的方法。经过一天的调试,似乎在 symfony 3.4 中,使用该应用程序的服务获得了一个命名空间而不是给定的连接,因为在 symfony 的 DI 组件中,它没有实现使用 PDOAdapter。
我现在所做的是将 PDOAdapter 服务直接注入到需要的服务中:
services:
cache.adapter.pdo:
class: Symfony\Component\Cache\Adapter\PdoAdapter
arguments: [ '@doctrine.dbal.default_connection' ]
blahfu.using.cache:
class: App\HeavyCacheUser
arguments: [ '@cache.adapter.pdo' ]
然后当然是注入它(我之前也做过但没有提到):
use Symfony\Component\Cache\Adapter\AdapterInterface;
class HeavyCacheUser
private $cache;
public function __construct(AdapterInterface $cacheAdapter){
$this->cache = $cache;
}
愿它能帮助受苦的其他人^^
喂!
我正在尝试在 Symfony 3.4 中获取缓存适配器 运行。我在这个项目中使用了 doctrine,所以似乎可以使用那个适配器(我在 2 个容器中有这个服务 运行,所以我需要一个缓存系统,这两个容器可以访问......并且有没有 Redis/Memcache...所以请不要对此提出任何建议 ;))。
这里是我做的配置的相关部分:
services:
cache.adapter.pdo:
class: Symfony\Component\Cache\Adapter\PdoAdapter
arguments: [ '@doctrine.dbal.default_connection' ]
blahfu.using.cache:
class: App\HeavyCacheUser
arguments: [ '@app.cache' ]
framework:
cache:
app: cache.adapter.pdo
doctrine:
dbal:
default_connection: default
connections:
default:...
...
我也添加了migration来添加对应的table:
使用以下查询(如 src/Symfony/Component/Cache/Traits/PdoTrait.php
中所示):
CREATE TABLE cache_items (
item_id VARBINARY(255) NOT NULL PRIMARY KEY,
item_data MEDIUMBLOB NOT NULL,
item_lifetime INTEGER UNSIGNED,
item_time INTEGER UNSIGNED NOT NULL
) COLLATE utf8_bin, ENGINE = InnoDB
当我尝试使用它时,我只得到缓存未命中....
示例:
$cacheKey = 'blahfu.bar';
$item = $this->cache->getItem($cacheKey);
if (!$item->isHit()) {
// Do $stuff
$item->set($stuff)->expiresAfter(900);
$this->cache->save($item);
Logger::info('Cache miss');
} else {
Logger::info('Cache hit');
}
return $item->get();
我错过了什么?
感谢您的帮助:)
我找到了如何让它工作的方法。经过一天的调试,似乎在 symfony 3.4 中,使用该应用程序的服务获得了一个命名空间而不是给定的连接,因为在 symfony 的 DI 组件中,它没有实现使用 PDOAdapter。
我现在所做的是将 PDOAdapter 服务直接注入到需要的服务中:
services:
cache.adapter.pdo:
class: Symfony\Component\Cache\Adapter\PdoAdapter
arguments: [ '@doctrine.dbal.default_connection' ]
blahfu.using.cache:
class: App\HeavyCacheUser
arguments: [ '@cache.adapter.pdo' ]
然后当然是注入它(我之前也做过但没有提到):
use Symfony\Component\Cache\Adapter\AdapterInterface;
class HeavyCacheUser
private $cache;
public function __construct(AdapterInterface $cacheAdapter){
$this->cache = $cache;
}
愿它能帮助受苦的其他人^^