当前位置:首页 > 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 实现系统级信号量锁。

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

注意事项

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

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

php 实现锁

标签: php
分享给朋友:

相关文章

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'localh…

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $n…

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 <…

php实现注册

php实现注册

注册功能实现步骤 数据库准备 创建用户表,包含字段如id、username、password、email等。示例SQL: CREATE TABLE users ( id INT AUTO_…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="log…