fostam/filelock

简单的基于文件的锁定,具有锁定超时和异常处理

v1.0.2 2020-10-16 22:29 UTC

This package is auto-updated.

Last update: 2024-09-17 06:54:59 UTC


README

简单的基于文件的锁定。

功能

  • 使用 flock() 进行基于文件的锁定
  • 适用于Unix-like系统和Windows
  • 支持获取锁的超时
  • 无第三方依赖项

安装

安装 FileLock 最简单的方法是使用 composer

$> composer require fostam/filelock

用法

<?php

require "vendor/autoload.php";

$fl = new \Fostam\FileLock\FileLock('mylock');
if (!$fl->acquire()) {
    exit;
}

// do exclusive stuff

$fl->release();

锁定

将锁的名称作为第一个参数传递给构造函数

$fl = FileLock('mylock');

使用 acquire() 方法获取锁

$fl->acquire();

成功时返回 true,如果锁已存在则返回 false。如果发生错误,将抛出异常(见下文)。

可选地,可以传递秒数作为超时

$fl->acquire(10);

acquire() 方法将每秒尝试获取锁一次,直到超时。如果无法获取锁,将返回 false

值为 0 将立即返回 false 如果锁定失败。如果没有提供超时,这也是默认行为。

解锁

显式释放锁

$fl->release();

如果在对象销毁时锁仍然存在,锁也会在 FileLock 类的析构函数中隐式释放。

锁文件

获取锁后,锁定进程的进程 ID (PID) 将写入锁文件。

默认情况下,锁文件将创建在系统临时目录中,该目录由 sys_get_temp_dir() 返回。可以将替代目录作为第二个参数传递给构造函数

$fl = FileLock('mylock', '/var/run');

在此示例中,锁文件将是 /var/run/mylock.lock

如果需要,可以从 FileLock 对象检索完整的锁文件名

$filename = $fl->getLockFileName();

如果锁文件存储在需要定期清理的地方(例如,大多数 Linux 系统上的 /tmp),则可以使用 refresh() 方法刷新它

$fl->refresh();

这将更新文件的修改时间为当前时间戳。

注意:为了避免竞争条件,释放锁时不会删除锁文件。

异常

所有异常都继承自公共 LockFileException 类。

acquire() 方法可能会抛出以下异常之一

  • LockFileNotOpenableException:无法创建或打开锁文件
  • LockFileOperationFailedException:对锁文件的文件系统操作失败
  • LockFileVanishedException:在获取锁后锁文件已消失

如果解锁文件系统操作失败,release() 方法将抛出 LockFileOperationFailureException 异常。