DOWER

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 就能看到全部内容。