当前位置:首页 > 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);

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

php 锁 三种实现

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 环境的项目,支持跨进程和分布式锁定。

php 锁 三种实现

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 锁性能高,适合分布式系统,但需要考虑锁过期和续期问题。

选择建议

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

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

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

相关文章

php实现文件下载

php实现文件下载

PHP实现文件下载的方法 通过PHP实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开: $fi…

php验证码的实现

php验证码的实现

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

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php 实现单点登录

php 实现单点登录

PHP 实现单点登录的方法 单点登录(SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于 PHP 的实现方案: 基于共享 Session 的方案 在同一个主域名下的子域名间可以通过共享…

php 伪静态实现

php 伪静态实现

PHP 伪静态实现方法 伪静态(URL Rewrite)是一种通过服务器配置将动态URL转换为静态URL的技术,提升URL的可读性和SEO效果。以下是几种常见的实现方式: 使用Apache的mod_…

php实现进度条

php实现进度条

PHP 实现进度条的方法 使用 HTML 和 CSS 结合 PHP 实现进度条 在 PHP 中,进度条通常通过 HTML 和 CSS 实现,PHP 负责计算进度并更新前端显示。 <di…