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);
虽然我们加锁了,但是可能会出现加锁竞争。
数据放到文件中的一些缺陷
- 数据量大时,性能变慢。
- 查找数据不方便。
- 并发会引起很多问题,比如加锁,但是太多加锁,会造成大量的等待解锁,已经锁抢占问题。
- 如果想在文件中的某位置插入一点数据,或删除一点数据,需要读取整个文件内容到内存,然后再把整个内容写回去,这是很大的开销。
- 没有一个访问权限系统,只能依托文件本身基于操作系统的权限。
数据库软件解决的问题
- 访问速度一般比文件快。
- 容易筛选数据。
- 有自己的并发访问机制。
- 有内置的权限系统。
总的来说,使用文件保存数据的方式,已经被淘汰了,目前主流是使用数据库了,比如 mysql,mogoDB。
存入文件中,目前多用于日志记录中。
PHP 的 SQLite 扩展,加强了文件作为保存数据的地方的应用。
如有任何侵权行为,请通知我删除,谢谢大家!
个人邮箱:865460609@qq.com