如何在PHP中启用SQLite3扩展加载以使用JSON1扩展?
解决PHP中SQLite3加载JSON1扩展的问题
遇到这个警告太正常了——SQLite3出于安全考量,默认是禁用扩展加载的,咱们可以通过两种靠谱的方式解决这个问题:
方法一:在PHP代码中启用扩展加载并加载json1.dll
PHP的SQLite3类已经封装了对应的启用方法,跟着步骤来就行:
创建SQLite3连接后启用扩展加载
先实例化SQLite3对象,然后调用enableLoadExtension()方法开启扩展加载功能:$db = new SQLite3('your_database.db'); // 启用扩展加载 $db->enableLoadExtension(true);加载json1.dll扩展
接下来调用loadExtension()方法加载你编译好的json1.dll,这里一定要注意路径的正确性:- 如果
json1.dll和你的PHP脚本在同一目录,直接写文件名即可; - 更稳妥的是使用绝对路径,比如:
// 替换成你实际的dll路径 $db->loadExtension('C:\\test\\ext\\json1.dll');注意Windows路径里的反斜杠要转义成双反斜杠,或者直接用正斜杠
/替代。- 如果
验证是否加载成功
可以执行一条简单的JSON相关SQL语句测试一下:$result = $db->query("SELECT json('{\"name\": \"test\"}')"); var_dump($result->fetchArray());如果能正常返回JSON解析后的结果,说明扩展已经加载成功了。
方法二:静态编译JSON1到SQLite(无需加载dll)
如果不想每次运行脚本都加载dll,还可以一劳永逸:在编译SQLite的时候直接把JSON1扩展静态编译进去,这样PHP使用的SQLite就自带JSON1功能了:
- 编译SQLite时加上
-DSQLITE_ENABLE_JSON1编译选项,之后重新编译PHP的SQLite3扩展,或者直接使用包含该选项的预编译SQLite库。 - 这种方式既避免了加载扩展的安全风险,也不用再操心路径和权限问题。
额外注意事项
- 32/64位匹配:一定要确保你编译的
json1.dll和你的PHP版本(32位或64位)完全一致,否则肯定会加载失败。 - PHP安全设置:检查
php.ini中的disable_functions配置,确保没有禁用SQLite3::enableLoadExtension和SQLite3::loadExtension这两个方法。 - 文件权限:Windows环境下要保证PHP进程有读取
json1.dll文件的权限,不然也会加载失败。
内容的提问来源于stack exchange,提问作者Nigel Alderton
相关产品推荐
相关产品推荐

