Contributed by
Jérémy Derussé
in #27456.
Lock组件 自 Symfony 3.4 起被引入,用来创建和管理锁定,即,一种对共享资源(shared resources)提供了排它访问的架构。对于本地锁定 (local locks,即,文件/信号等)以及分发锁定(distributed locks,即,Memcache/Redis等), 它极好地支持了不同存储(类型)。在 Symfony 4.2 中我们更添加了一个全新的基于PDO的锁定存储。
这是有意义的,因为多数 Symfony 程序已经使用了 MySQL/MariaDB 或 PostgreSQL 来进行数据的持久化。然而,这种新存储类型并不依赖这类数据库 (PostgreSQL 的 pg_advisory_lock_shared
以及 MySQL/MariaDB 的 GET_LOCK
) 的内置锁定架构,因为它们并不足够可靠。它们依赖的是 TCP 连接,进而需要深度调整数据库引擎,以便在重启之后不接受新的连接,或者定义一个比最大锁定周期更大的超时(数值)。
全新的 PdoStore
类需要一个 PDO 对象,一个 Doctrine DBAL 连接对象,或者一个 DSN (Data Source Name) 字符串,以便配置此存储:
1 2 3 4 5 6 7 8 9 | use Symfony\Component\Lock\Store\PdoStore;
// a PDO, a Doctrine DBAL connection or DSN for lazy connecting through PDO
// 通过 PDO 实现的 lazy 连接
$databaseConnectionOrDSN = 'mysql:host=127.0.0.1;dbname=lock';
$store = new PdoStore($databaseConnectionOrDSN, [
'db_username' => 'myuser',
'db_password' => 'mypassword'
]); |
然后,创建一个表来存储锁定信息。你可以使用 PdoStore
类的 createTable()
方法来实现:
1 2 3 4 5 6 | try {
$store->createTable();
} catch (\PDOException $exception) {
// the table could not be created for some reason
// 因某些原因,此表不可以被创建
} |
对于任意锁定类型,现在你可以创建和管理 文档中解释的这种 基于PDO的锁定了。