PHP SQLite3扩展加载失败:loadExtension调用出现.so.so重复后缀报错
问题根因
SQLite3::loadExtension() 方法在Linux环境下会自动给传入的扩展名称拼接.so后缀,所以你传入带.so的文件名时,最终拼接出的路径就是.so.so的重复后缀,这是第一个报错的直接原因。
排查解决步骤
- 第一步先确认文件本身的状态
先执行命令检查扩展文件是否存在于目标路径:
确保输出里存在ls -al /usr/lib/php/20180731 | grep libdbplusql_81203libdbplusql_81203.so文件,同时确认Apache运行用户(一般为www-data)对该文件有可读可执行权限,权限不对的话执行以下命令修正:chmod 755 /usr/lib/php/20180731/libdbplusql_81203.so - 检查PHP动态加载扩展的开关是否开启
Apache模式下运行的PHP默认关闭了动态加载扩展的功能,你需要修改Apache对应的php.ini配置文件(通常路径为/etc/php/<你的PHP版本>/apache2/php.ini),找到enable_dl参数,将其设置为On:
修改完成后重启Apache生效:enable_dl = On
之后代码里调用systemctl restart apache2loadExtension的时候不需要加.so后缀,直接传libdbplusql_81203即可。 - 更推荐的方案:用php.ini静态加载扩展
动态加载扩展存在安全风险,生产环境不建议使用,你可以直接在php.ini中添加扩展加载配置,无需在业务代码中处理:
改完重启Apache即可,同时删掉代码中调用extension=libdbplusql_81203.soloadExtension的语句。 - 额外排查:扩展版本兼容性
如果以上步骤都做完还是加载失败,需要确认你用的libdbplusql_81203.so编译时的PHP版本、线程安全配置和你当前运行的PHP完全匹配,版本不兼容的扩展是无法正常加载的。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

