Contributed by
Jérémy Derussé
in #26232.

Lock 组件 从 Symfony 3.4 起引入,提供了一种架构,来创建本地的 (文件系统,信号系统) 和远程的 (Redis) 锁定,提供对共享资源的排他访问。尽管这是最新的组件,也已被用在诸如 Contao CMSGoogle Cloud SDK 等项目中了。

它的一个最关键功能是 expiring locks(解除锁定),它是指在一定时间之后(活跃的时间被称作TTL),锁定被自动释放。如果是长时间运行的任务,十分难以选出最佳 TTL,因此一般是选择一个不那么长的 TTL 然后使用 refresh() 方法来把 TTL 重置到一开始的值。

1
2
3
4
5
6
7
8
9
10
$lock->acquire();
try {
    while (!$finished) {
        // perform a small part of the job...
        // 
        $lock->refresh();
    }
} finally {
    $lock->release();
}

refresh() 的问题是,当你处于不同类型的任务时,刷新后的 TTL 可能无法满足复杂任务的需求。这就是为保 Symfony 4.1 中我们改进了 refresh() 方法,允许传入一个 TTL 值作为它的参数。新的 TTL 只能用在 refresh() 的调用中,无法在下面代码中使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// the original TTL is 30 seconds
// 原始 TTL 是 30 秒
$lock = $factory->createLock('the-lock-name', 30);
// ...
$lock->acquire();
 
// refresh the lock for 30 seconds
// 刷新锁定 30 秒
$lock->refresh();
// do some work...
// 做一些事...
 
// refresh the lock for 10 minutes (600 seconds) before a heavy task
// 对于重载任务,刷新锁定 10 分钟(600秒)
$lock->refresh(600);
// do some heavy work...
// 做一些重载工作...
 
// the new refresh is for the 30 seconds of the original TTL
// 新的锁定,是 30 秒的原始 TTL
$lock->refresh();
// do some work...
// 做一些事...