gpt4 book ai didi

php - flock 是否跨进程锁定文件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:19 25 4
gpt4 key购买 nike

以下代码在调用 file_get_contents 时触发文件不存在的错误,尽管这种情况很少发生,即使 file_exists 仅在上面的几个语句中被调用。

我认为在调用 file_exists 期间触发了错误,该文件已被 cron 作业删除。

$isRead = self::FILE_READ === $action;
$exists = file_exists($file);
$handle = fopen($file, ($isRead ? 'r' : 'c+'));
if ($handle) {
$locked = flock($handle, ($isRead ? LOCK_SH : LOCK_EX));
if ($locked) {
if ($exists) {
// Sometimes (very rarely) the following line triggers an error that
// $file does not exist
$data = (int)file_get_contents($file);
} else {
$data = 0;
}

if ($isRead) {
// Get Counter
flock($handle, LOCK_UN);

return $data;
}

// Update Counter
if (self::FILE_UPDATE === $action) {
$value += $data;
}
ftruncate($handle, 0);
rewind($handle);
fwrite($handle, $value);
flock($handle, LOCK_UN);

return true;
}
trigger_error("[FileCache] Failed to acquire lock for updating ${file}", E_USER_ERROR);
} else {
trigger_error("[FileCache] Failed to open file ${file}", E_USER_ERROR);
}

PHP 中的 flock 是否保证文件不会被任何其他进程修改?还是仅限于当前流程?

此外,unlink 在 php 中是否尊重 flock

最佳答案

在 Linux(和其他 UNIX)系统上,flock() 纯粹是一个咨询锁。它将阻止其他进程使用 flock() 获取同一文件上的冲突锁,但不会阻止文件被修改或删除。

在 Windows 系统上,flock() 是一个强制锁,将防止对文件进行修改。

关于php - flock 是否跨进程锁定文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55556706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com