以下代码在调用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
?
答案 0 :(得分:0)
在Linux(和其他UNIX)系统上,flock()
纯粹是建议性锁定。它将防止其他进程使用flock()
获得对同一文件的冲突锁,但不会阻止文件的修改或删除。
在Windows系统上,flock()
是强制性锁定,将防止对该文件进行修改。