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的锁定了。