当前位置:首页 > PHP

php 锁 三种实现

2026-04-03 13:01:03PHP

PHP 锁的三种实现方式

文件锁(flock)

使用 flock() 函数对文件进行锁定,适用于单机环境。

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

文件锁的优点是实现简单,缺点是性能较低且不适合分布式环境。

MySQL 锁

通过数据库的 GET_LOCK()RELEASE_LOCK() 函数实现。

$conn = new mysqli("localhost", "user", "pass", "db");
$lockName = "my_lock";
$timeout = 10; // 秒

// 获取锁
$result = $conn->query("SELECT GET_LOCK('$lockName', $timeout)");
if ($result->fetch_row()[0] == 1) {
    // 临界区代码
    $conn->query("SELECT RELEASE_LOCK('$lockName')");
} else {
    echo "获取锁超时";
}

MySQL 锁适合已有 MySQL 环境的项目,支持跨进程和分布式锁定。

Redis 锁

使用 Redis 的 SETNX 命令实现分布式锁。

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$lockKey = 'resource_lock';
$lockExpire = 30; // 秒

// 尝试获取锁
$isLocked = $redis->set($lockKey, 1, ['nx', 'ex' => $lockExpire]);
if ($isLocked) {
    // 临界区代码
    $redis->del($lockKey); // 释放锁
} else {
    echo "资源被锁定";
}

Redis 锁性能高,适合分布式系统,但需要考虑锁过期和续期问题。

php 锁 三种实现

选择建议

  • 单机简单应用:文件锁
  • 已有 MySQL 环境:MySQL 锁
  • 高性能分布式系统:Redis 锁

每种方案都有适用场景,需根据具体需求选择。

标签: 三种php
分享给朋友:

相关文章

php实现购物车

php实现购物车

PHP实现购物车功能 购物车功能是电商网站的核心模块之一,通常涉及商品添加、删除、数量修改和结算等操作。以下是使用PHP实现购物车功能的几种方法。 使用Session存储购物车数据 Session是…

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Ratc…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php实现注册

php实现注册

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

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…

php验证码的实现

php验证码的实现

PHP 验证码实现方法 使用 GD 库生成基础验证码 创建画布并生成随机字符串作为验证码内容: session_start(); $width = 120; $height = 40; $image…