2.4. 文件锁 flock()

未匹配的标注

持之以恒,方得始终!

如果多个用户同时往一个文件中读写,此时文件的内容可能无法保证是我们所期望的。

因此当一个文件被打开,在进行读写操作之前,应该使用flock()加锁。

flock(resource $handle, int $operation, int &$wouldblock = ?): bool
加锁成功返回true,否则返回false

operation 可以是以下值之一:

  • LOCK_SH取得共享锁定(读取的程序)。
  • LOCK_EX 取得独占锁定(写入的程序。
  • LOCK_UN 释放锁定(无论共享或独占)。

具体怎么用,我们可以看 手册

写入文件加锁

$data = date('Ymd His');

// 打开文件,准备追加内容
$fp = fopen("./myorders.txt", 'ab');

// 加写入的独占锁
flock($fp, LOCK_EX);

// 写入
fwrite($fp, $data);

// 写完释放锁
flock($fp, LOCK_UN);

// 关闭文件
fclose($fp);

读文件加锁

// 只读的方式打开一个文件
$fp = fopen("./myorders.txt", 'rb');

// 加读共享锁
flock($fp, LOCK_SH);

// 读文件内容
while(!feof($fp)) {
    $line = fgets($fp);
    echo $line;
}

// 解锁
flock($fp, LOCK_UN);

// 关闭文件
fclose($fp);

虽然我们加锁了,但是可能会出现加锁竞争。

数据放到文件中的一些缺陷

  1. 数据量大时,性能变慢。
  2. 查找数据不方便。
  3. 并发会引起很多问题,比如加锁,但是太多加锁,会造成大量的等待解锁,已经锁抢占问题。
  4. 如果想在文件中的某位置插入一点数据,或删除一点数据,需要读取整个文件内容到内存,然后再把整个内容写回去,这是很大的开销。
  5. 没有一个访问权限系统,只能依托文件本身基于操作系统的权限。

数据库软件解决的问题

  1. 访问速度一般比文件快。
  2. 容易筛选数据。
  3. 有自己的并发访问机制。
  4. 有内置的权限系统。

总的来说,使用文件保存数据的方式,已经被淘汰了,目前主流是使用数据库了,比如 mysql,mogoDB。

存入文件中,目前多用于日志记录中。

PHP 的 SQLite 扩展,加强了文件作为保存数据的地方的应用。

如有任何侵权行为,请通知我删除,谢谢大家!
个人邮箱:865460609@qq.com

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
Junwind
讨论数量: 0
发起讨论 只看当前版本


暂无话题~