当前位置:首页 > 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实现文件下载

PHP 实现文件下载的方法 使用 header() 函数强制下载 设置正确的 HTTP 头信息,强制浏览器下载文件而不是直接打开。 $file = 'path/to/file.pdf'; if (f…

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="upload…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素(不移除…

php 实现排序

php 实现排序

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

php 实现单链表

php 实现单链表

单链表的基本概念 单链表是一种线性数据结构,由节点组成,每个节点包含数据域和指向下一个节点的指针域。链表的头节点是访问整个链表的入口。 单链表的节点类实现 在PHP中,可以通过类来定义链表节…

php实现mvc

php实现mvc

PHP 实现 MVC 架构 MVC(Model-View-Controller)是一种常用的软件设计模式,将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller…