PHP Conference Japan 2024

wincache_lock

(PECL wincache >= 1.1.0)

wincache_lock获取给定键的独占锁

描述

wincache_lock(字符串 $key, 布尔值 $isglobal = false): 布尔值

获取给定键的独占锁。当前脚本的执行将被阻塞,直到能够获取锁为止。一旦获取到锁,尝试使用相同键请求锁的其他脚本将被阻塞,直到当前脚本使用 wincache_unlock() 释放锁。

警告

在类似 FastCGI 的多进程环境中执行 PHP 脚本时,使用 wincache_lock()wincache_unlock() 可能会导致死锁。除非您绝对确定需要使用这些函数,否则请勿使用它们。对于用户缓存的大多数操作,不需要使用这些函数。

参数

key

要获取锁的缓存中键的名称。

isglobal

控制锁的作用域是系统范围还是本地范围。在 IIS FastCGI 的情况下,本地锁的作用域限制在应用程序池中,或者限制在具有相同父进程标识符的所有 php 进程中。

返回值

成功时返回 true,失败时返回 false

示例

示例 #1 使用 wincache_lock()

<?php
$fp
= fopen("/tmp/lock.txt", "r+");
if (
wincache_lock(“lock_txt_lock”)) { // 执行独占锁
ftruncate($fp, 0); // 截断文件
fwrite($fp, "在此处写入内容\n");
wincache_unlock(“lock_txt_lock”); // 释放锁
} else {
echo
"无法获取锁!";
}
fclose($fp);
?>

参见

添加注释

用户贡献的注释 2 条注释

PrisonDoom
5 年前
外部链接失效,并且大多数时候反斜杠“\”用于“转义字符”。无论如何,谢谢。
donraman at microsoft dot com
14 年前
用户应该知道字符“\”不能作为锁名称的一部分。反斜杠不被允许的原因是我们在使用 CreateMutex 调用,如 http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx 中所述。根据本文,第三个参数不能包含“\”字符,该字符是锁名称。

这意味着以下代码将无法工作。

<?php

$ret_val
= wincache_lock("C:\WINDOWS\Temp/cache");
echo
$ret_val . '<br>';
$ret_val = wincache_unlock("C:\WINDOWS\Temp/cache");
echo
$ret_val . '<br>';

?>
To Top