【问题标题】:Does flock lock the file across processes?羊群是否跨进程锁定文件?
【发布时间】:2019-04-07 07:41:36
【问题描述】:

以下代码在调用 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

【问题讨论】:

    标签: php linux flock


    【解决方案1】:

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

    在 Windows 系统上,flock() 是强制锁,会阻止对文件的修改。

    【讨论】:

    • 谢谢。但我的问题是关于 PHP 内部的。 php解释器是否尊重另一个进程的锁?
    • 我的回答是关于 PHP 内部的。 PHP 中唯一使用flock() 的部分是flock()
    猜你喜欢
    • 2011-02-07
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    相关资源
    最近更新 更多