Symfonyob娱乐下载 2.6新增功能:LockHandler
2014年9月24日·发表的哈维尔Eguiluz
警告:这篇文章是关于一个不受支持的Symfony版本。ob娱乐下载有些信息可能已经过时了。阅读最新的Symfony文档ob娱乐下载.
提供的
格雷戈勒Pineau
在# 10475.
文件锁定是一种机制,它通过在任何特定时间只允许一个用户或进程访问来限制对计算机文件的访问。这种机制是在1963年为大型机引入的,它将从2.6版开始在Symfony中首次亮相。ob娱乐下载
新LockHandler
类提供了通过文件锁来锁定任何东西的简单抽象。它的最常见的用例是通过锁定命令来避免竞争条件,相同的命令不能被不同的进程同时执行。
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输出\OutputInterface;使用ob娱乐下载\组件\文件系统\LockHandler;类UpdateContentsCommand扩展命令{受保护的函数配置(){/ /……}受保护的函数执行(InputInterface$输入, OutputInterface$输出){//创建锁$锁=新LockHandler (的内容更新:);如果(!$锁->锁()){$输出->writeln (该命令已经在另一个进程中运行。);返回0;}/ /……做一些任务//(可选)释放锁(否则,PHP将执行此操作//自动为你)$锁->release ();}}
的LockHandler
构造函数的第一个参数是锁标识符,它将作为用于创建锁的文件名的一部分。默认情况下,锁创建在系统的临时目录中。如果要使用特定的目录,将其作为构造函数的第二个可选参数传递。
的lock ()
方法返回真正的
如果获得了锁假
否则。此外,您还可以有选择地传递一个布尔参数,以指示是否要等待所请求的锁被释放。这对于在另一个锁定命令完成后执行一个命令非常有用:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
类UpdateContentsCommand扩展命令{/ /……受保护的函数执行(InputInterface$输入, OutputInterface$输出){//创建锁$锁=新LockHandler (的内容更新:);//等待锁释放,只要有必要如果(!$锁->锁(真正的)) {$输出->writeln (该命令已经在另一个进程中运行。);返回0;}/ /……}}
锁处理程序被故意限制为只与基于文件的锁一起工作,因为要使它在网络或数据库上工作非常复杂。这意味着它只在使用一个且只有一个主机时才能工作。如果您有多个主机,则不能使用此帮助程序。
发表在#生活在边缘
评论
Loick Piera
2014年9月24日在08:37
@javier我不知道,谢谢。最后一件事,这个方法被称为“释放”而不是“解锁”(它可能在开发过程中发生了变化,因为PR的例子也不是最新的最终实现);)
@Loick感谢报告这个错误。我刚刚将方法名称更新为“release()”,顺便说一下,这对我来说更有意义。
供您参考,“release”方法是可选的,因为PHP将在脚本执行结束时租用锁。
@Roger,对于阻塞锁,命令将等待,但可能会有一些问题阻止获得锁。在这些情况下,命令不会永远等待,它将返回false,如以下代码行所示:https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Filesystem/LockHandob娱乐下载ler.php#L82-87
你能在你的例子中为LockHandler类添加' use '语句吗?现在我们还看不到这个类的命名空间;)
Javier Eguiluz is a certified Symfony engineer.
Get certified! Online exams available in all countries.
Register Now