群是否跨进程锁定文件?

时间:2019-04-07 07:41:36

标签: php linux flock

以下代码在调用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中的蜂群是否可以保证文件不会被任何其他进程修改?还是仅限于当前流程?

此外,php中的unlink是否荣誉flock

1 个答案:

答案 0 :(得分:0)

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

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