Ubuntu24系统PHP8.3安装oci8扩展后启用报错:/usr/lib/php20230831/oci8.so (libaio.so.1 cannot open shared object file No such file or directory)的解决方法

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。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注