概述
<?php
namespace AppTools;
use Log;
use Exception;
//command 文件锁 command执行完毕会释放
class CmdLock
{
public function __construct($called_class)
{
$lanmao_lock_path = sys_get_temp_dir() . '/lanmao_lock';
if (!is_dir($lanmao_lock_path)) {
mkdir($lanmao_lock_path);
}
$this->called_class = $called_class;
$class_info = explode('\', $called_class);
$this->class = end($class_info);
$this->lockname = $this->class . '.lock';
$this->lock_path = $lanmao_lock_path . '/';
$this->lock_realpath = $this->lock_path . $this->lockname;
$this->lock = fopen($this->lock_realpath, 'w+');
}
public function lock()
{
$date = date("Ymd H:i:s", time(null));
$msg = "command: {$this->class} ========> 准备加锁";
Log::info($msg);
if (flock($this->lock, LOCK_EX | LOCK_NB)) {
Log::info("command: {$this->class} ========> 锁定...");
return true;
}
throw new Exception('加锁失败! ===> ' . $this->called_class);
}
public function unlock()
{
$msg = "command: {$this->class} ========> 准备释放锁";
Log::info($msg);
flock($this->lock, LOCK_UN);
fclose($this->lock);
}
}
(执行脚本前需要创建 相应的lock文件 利用flock 对已经存在的文件进行锁控制)
以前加锁做法是 通过创建 一个 xxx.lock文件 确认加锁 执行完毕 删除xxx.lock
这种做法有个弊端就是,并发的情况下,如果程序抛出异常 会导致lock一直挂在那 无法解锁
现在的加锁方案是 利用linux flock 加锁机制 可以考虑 阻塞 和非阻塞的模式 。即使抛异常 也不影响 下次执行。
最后
以上就是文静电话为你收集整理的php文件锁实例的全部内容,希望文章能够帮你解决php文件锁实例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复