Contributed by
Jérémy Derussé
in #26232.
Lock 组件 从 Symfony 3.4 起引入,提供了一种架构,来创建本地的 (文件系统,信号系统) 和远程的 (Redis) 锁定,提供对共享资源的排他访问。尽管这是最新的组件,也已被用在诸如 Contao CMS 和 Google 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...
// 做一些事... |