PHP Warning: PHP Startup: Unable to load dynamic library 'oci8.so' (... libaio.so.1: cannot open shared object file: No such file or directory ...)
这个报错说明 OCI8 扩展编译和安装都成功了,但运行时找不到 libaio.so.1 这个共享库。
libaio 是 Oracle Instant Client 和 OCI8 必须依赖的异步 I/O 库(libaio1 包提供),Ubuntu 上默认不一定预装,或者安装后路径/链接有问题。
解决方法是安装 libaio1 包:
sudo apt update
sudo apt install libaio1
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成
没有可用的软件包 libaio1,但是它被其它的软件包引用了。
这可能意味着这个缺失的软件包可能已被废弃,
或者只能在其他发布源中找到
E: 软件包 libaio1 没有可安装候选
以上报错是因为 Ubuntu 24.04 (Noble Numbat) 引入了 64-bit time_t 迁移(time_t 从 32 位升级到 64 位,以避免 2038 年问题),导致许多库包名后缀改为 t64。
原来的 libaio1 包已被废弃/移除。替换包是 libaio1t64(提供相同的功能,共享库名为 libaio.so.1t64)。
Oracle Instant Client(例如 23.x 版本)的PHP扩展oci8仍然链接到旧的 libaio.so.1(SONAME 未更新),所以即使安装了 libaio1t64,OCI8 加载时还是找不到 libaio.so.1,报错 libaio.so.1: cannot open shared object file。
解决这个问题步骤如下:
1 安装正确的包(libaio1t64):
sudo apt update
sudo apt install libaio1t64
这会安装/usr/lib/x86_64-linux-gnu/libaio.so.1t64文件(或类似路径)。
2 创建符号链接,让系统/Instant Client 能找到旧名字 libaio.so.1
先确认共享库libaio.so的路径(通常在下面位置):
find /usr/lib /lib -name "libaio.so.1t64" 2>/dev/null
输出如下:
/usr/lib/x86_64-linux-gnu/libaio.so.1t64
然后创建软链接:
sudo ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/x86_64-linux-gnu/libaio.so.1
有些 Oracle Instant Client 可能还找 libaio.so,因此额外保险做法是:
sudo ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/x86_64-linux-gnu/libaio.so
如果你的 Instant Client 目录下也需要libaio.so.1和libaio.so(极少见,但可尝试),进入你的 Instant Client 目录(如 /opt/oracle/instantclient_23_26):
cd /opt/oracle/instantclient_23_26
sudo ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 libaio.so.1
sudo ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 libaio.so
3 更新动态链接器缓存(让系统立即识别新链接):
sudo ldconfig
4 验证是否解决了上述问题
检查库是否存在:
ldconfig -p | grep libaio
在输出信息中应该看到 libaio.so.1(或 libaio.so.1t64)。
测试 PHP 加载 OCI8扩展:
php -m | grep oci8
如果输出 oci8,表示加载成功!
补充说明
libaio1t64包和libaio1包是二进制兼容的,t64 迁移只改了 time_t 类型,不会破坏 libaio 的 API。