首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >flock是否跨进程锁定文件?

问flock是否跨进程锁定文件?
EN

Stack Overflow用户
提问于 2019-04-07 07:41:36
回答 1查看 521关注 0票数 2

下面的代码在调用file_get_contents文件不存在时会触发一个错误(尽管很少发生),即使上面只调用了几个file_exists语句。

我相信文件在file_exists被称为错误触发之间被cron作业删除了。

代码语言:javascript
复制
$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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-07 08:16:37

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

在Windows上,flock()是一个强制锁,将阻止对文件的修改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55556706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档