当前位置:首页 > PHP

php锁实现

2026-01-29 23:37:44PHP

PHP 锁的实现方法

文件锁(flock)

文件锁是一种基于文件的互斥锁实现方式,适用于单机环境。通过 flock 函数可以对文件进行加锁和解锁操作。

$fp = fopen("lockfile.lock", "w+");
if (flock($fp, LOCK_EX)) { // 获取独占锁
    // 执行需要加锁的代码
    flock($fp, LOCK_UN); // 释放锁
} else {
    echo "无法获取锁";
}
fclose($fp);

LOCK_EX 表示独占锁,其他进程无法获取;LOCK_SH 表示共享锁,允许多个进程同时读取。文件锁在进程结束后会自动释放,但显式调用 LOCK_UN 更安全。

php锁实现

数据库锁

数据库锁利用数据库的原子性操作实现,适用于分布式环境。常见方式包括行锁、表锁或乐观锁。

// 使用 SELECT ... FOR UPDATE 实现行锁
$pdo->beginTransaction();
$stmt = $pdo->prepare("SELECT * FROM orders WHERE id = 1 FOR UPDATE");
$stmt->execute();
// 执行需要加锁的操作
$pdo->commit();

乐观锁通过版本号或时间戳实现:

php锁实现

// 更新时检查版本号
$stmt = $pdo->prepare("UPDATE products SET stock = stock - 1, version = version + 1 WHERE id = 1 AND version = ?");
$stmt->execute([$oldVersion]);
if ($stmt->rowCount() === 0) {
    throw new Exception("并发冲突");
}

Redis 锁

Redis 锁适用于分布式系统,通过 SETNXRedLock 算法实现。

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$lockKey = 'resource_lock';
$token = uniqid();
$expire = 300; // 锁过期时间(秒)

// 尝试获取锁
if ($redis->set($lockKey, $token, ['NX', 'EX' => $expire])) {
    try {
        // 执行需要加锁的代码
    } finally {
        // 释放锁(Lua脚本保证原子性)
        $script = "
        if redis.call('get', KEYS[1]) == ARGV[1] then
            return redis.call('del', KEYS[1])
        else
            return 0
        end";
        $redis->eval($script, [$lockKey, $token], 1);
    }
} else {
    echo "获取锁失败";
}

Semaphore 信号量

PHP 的 sysvsem 扩展提供 System V 信号量支持,适用于多进程同步。

$semKey = ftok(__FILE__, 't');
$semId = sem_get($semKey);
if (sem_acquire($semId)) { // 阻塞获取信号量
    // 执行需要同步的代码
    sem_release($semId); // 释放信号量
}

注意事项

  • 锁的粒度应尽量小,避免长时间持有锁
  • 分布式锁需设置合理的过期时间,防止死锁
  • 考虑锁的重入问题(同一线程多次获取锁)
  • 文件锁在 NFS 文件系统上可能不可靠
  • 数据库锁可能影响性能,需合理设计索引

标签: php
分享给朋友:

相关文章

php队列的实现

php队列的实现

PHP队列的实现方式 PHP中实现队列功能可以通过多种方式,根据需求选择适合的方案: 使用数组实现基础队列 PHP数组本身支持队列操作,利用array_push和array_shift函数: $q…

php实现接口

php实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不实现具体功能。类可以实现一个或多个接口,并必须实现接口中定义的所有方法。 定义接口 接口使用 inter…

php 实现mvc

php 实现mvc

PHP 实现 MVC 架构的方法 MVC(Model-View-Controller)是一种常见的软件设计模式,用于分离业务逻辑、用户界面和用户输入。以下是 PHP 实现 MVC 架构的关键步骤:…

php实现伪静态

php实现伪静态

PHP 实现伪静态的方法 伪静态(URL Rewrite)是一种将动态URL转换为看似静态URL的技术,提升SEO友好性和用户体验。以下是几种常见的实现方式: 使用 Apache 的 mod_rew…

php实现重定向

php实现重定向

使用header函数进行重定向 在PHP中,header()函数是实现重定向的常用方法。通过发送HTTP头信息Location,浏览器会自动跳转到指定URL。需确保在调用header()前没有输出任何…

php 实现路由

php 实现路由

PHP 实现路由的方法 在 PHP 中实现路由功能可以通过多种方式完成,以下是几种常见的实现方法: 使用原生 PHP 实现简单路由 通过解析 URL 并匹配对应的处理逻辑,可以实现基本的路由功能。以…