正确安装 php-leveldb 扩展需统一编译 LevelDB 与扩展源码,确保 ABI 兼容;new LevelDB() 要求路径为已存在、可写、不带尾斜杠的目录;数据需手动序列化,批量操作必须用 LevelDBWriteBatch。

PHP 使用 leveldb 不是“直接调用库”,而是通过扩展操作——没装对扩展、路径权限错、选项传错,new LevelDB() 会静默失败或报 Segmentation fault。
如何正确安装 php-leveldb 扩展(不是 apt 包)
系统自带的 libleveldb-dev + php-leveldb 混用必炸,运行时报 undefined symbol: _ZN7leveldb2DB4Open 就是典型 ABI 不匹配。
- 必须用同一份源码编译:
git clone https://github.com/google/leveldb→cmake -DBUILD_SHARED_LIBS=ON . && make && sudo make install - 再编译扩展:
git clone https://github.com/reeze/php-leveldb→./configure --with-leveldb=/usr/local --with-php-config=/usr/bin/php-config -
make install后确认leveldb.so在extension_dir下,且php.ini中有extension=leveldb.so - 验证:
php -m | grep leveldb要能输出,php -r "new LevelDB('/tmp/test');"不崩溃
new LevelDB($path) 失败的三大硬坑
不是代码写错,是环境卡死:目录不存在、不可写、路径带斜杠,它连提示都不给,直接构造失败或 segfault。
-
$path必须是**已存在且进程可写的目录**,不是文件,也不能末尾带/("/tmp/db/"❌,"/tmp/db"✅) - Linux 下提前
mkdir -p /tmp/mydb && chmod 755 /tmp/mydb;Windows 下路径用正斜杠"C:/data"或双反斜杠"C:\data" -
create_if_missing选项只在 PHP 扩展中生效,但必须显式传:new LevelDB("/tmp/db", ["create_if_missing" => true]) - 反复
new同一路径不关旧实例?LevelDB 不支持多实例并发写,会损坏数据
put()/get() 的数据陷阱:它不认整数、不自动序列化
LevelDB 底层只存 std::string,PHP 扩展把所有值转成字节流塞进去——但 put("k", 123) 存的是字符串 "123",不是二进制 0x7B。
- 想存 int/float/struct?自己序列化:
$db->put("ts", pack("Q", time())),读时unpack("Q", $db->get("ts")) -
get("nonexistent_key")返回false,不是空字符串,别用empty()判定存在性 -
delete("key")总是返回true,哪怕 key 原本就不存在——它不报错,也不告诉你删没删到 - key 和 value 中避免含

