Flat-File 存储:不装数据库的动态博客
很多人以为「动态博客」必须有数据库。其实动态指的是内容与模板分离,跟存储引擎无关。
存储层做了什么
$tmp = $path . '.tmp' . bin2hex(random_bytes(4));
$fh = fopen($tmp, 'wb');
flock($fh, LOCK_EX);
fwrite($fh, $json);
fflush($fh);
flock($fh, LOCK_UN);
fclose($fh);
rename($tmp, $path); // 同分区 rename 是原子操作
关键点在最后一行:先写临时文件,再 rename 覆盖。
这样即使写入过程中进程被杀,也不会留下半个损坏的 JSON——读者要么看到旧版本,要么看到新版本。
读也要加锁
读操作使用 LOCK_SH 共享锁,避免读到 rename 的瞬间。
flock($fh, LOCK_SH);
$raw = stream_get_contents($fh);
flock($fh, LOCK_UN);
什么时候该换数据库
- 多作者并发写入
- 需要按任意字段组合查询、分页、全文检索
- 文章数量上万
没到这些线之前,文件存储的运维成本几乎为零:直接 cat data/posts.json 就能看到全部内容。