当前位置:首页 > PHP

php 实现锁

2026-01-15 12:43:36PHP

PHP 实现锁的常见方法

文件锁(flock)

利用 flock 函数对文件进行独占锁定,适用于单机环境。

$fp = fopen("lockfile.lock", "w+");
if (flock($fp, LOCK_EX)) { // 获取独占锁
    // 执行临界区代码
    flock($fp, LOCK_UN); // 释放锁
} else {
    echo "获取锁失败";
}
fclose($fp);

MySQL 悲观锁

通过数据库的 SELECT ... FOR UPDATE 实现行级锁,适用于分布式环境。

$pdo->beginTransaction();
$stmt = $pdo->prepare("SELECT * FROM table WHERE id = ? FOR UPDATE");
$stmt->execute([$id]);
// 执行临界区操作
$pdo->commit(); // 事务提交后自动释放锁

Redis 分布式锁

利用 Redis 的 SETNX 命令实现分布式锁,需注意设置超时时间避免死锁。

$redis = new Redis();
$redis->connect('127.0.0.1');
$lockKey = 'resource_lock';
$expire = 10; // 锁超时时间(秒)

if ($redis->set($lockKey, 1, ['NX', 'EX' => $expire])) {
    // 获取锁成功
    // 执行临界区代码
    $redis->del($lockKey); // 释放锁
} else {
    echo "获取锁失败";
}

PHP 信号量(Semaphore)

使用 sem_acquiresem_release 实现系统级信号量锁。

php 实现锁

$semKey = ftok(__FILE__, 't');
$semId = sem_get($semKey);
if (sem_acquire($semId)) {
    // 执行临界区代码
    sem_release($semId);
}

注意事项

  • 文件锁仅适用于单机环境,性能较低
  • 数据库锁可能影响并发性能,需合理设计事务范围
  • Redis 分布式锁需处理锁续期和原子性释放问题
  • 信号量需要系统支持,Windows 环境下可能不可用

选择锁机制时应根据实际场景(单机/分布式)、性能要求和数据一致性需求进行权衡。

标签: php
分享给朋友:

相关文章

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php 实现排序

php 实现排序

PHP 实现数组排序的方法 PHP 提供了多种内置函数和方法来实现数组排序,适用于不同的排序需求。以下是一些常见的排序实现方式: 使用 sort() 函数对数组进行升序排序 sort() 函数对数组…

php 实现md5

php 实现md5

使用 PHP 内置函数实现 MD5 PHP 提供了 md5() 函数,可以直接计算字符串的 MD5 哈希值。该函数接受一个字符串参数,返回 32 字符的十六进制哈希值。 $string = "H…

php实现扫码登录

php实现扫码登录

PHP 实现扫码登录的方案 扫码登录通常基于以下流程:用户访问网页生成二维码(含唯一标识),手机扫码后确认登录,服务器验证并完成登录状态同步。以下是具体实现方法: 生成二维码与唯一标识 使用 PHP…

php 自动登录实现

php 自动登录实现

自动登录的实现方法 PHP中实现自动登录通常涉及使用Cookie存储用户凭证,并在用户再次访问时自动验证。以下是几种常见的方法: 使用Cookie存储用户凭证 用户登录成功后,生成一个唯一的Tok…

php树形菜单的实现

php树形菜单的实现

PHP树形菜单的实现方法 实现树形菜单通常涉及数据库设计、数据查询和前端展示三个部分。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 这是最简单的树形结构存储方式,每个节点…