在使用 PHP 部署 Web 应用,特别是采用 nginx + php-fpm 架构时,部分开发者在通过 ODBC 方式连接 YashanDB 数据库时会遇到如下问题:

unixODBCCan't open lib '/home/yashandb_odbc/libyas_odbc.so': file not found

明明驱动文件路径设置正确,isql 也能正常连库,为什么 PHP 就报错?

一、问题现象

应用部署环境:

Web 服务架构:nginx + php-fpm

PHP 连接方式:ODBC 拓展

错误信息如下:

[unixODBC][Driver Manager]Can't open lib '/home/yashandb_odbc/libyas_odbc.so': file not found​

但执行以下命令检查驱动文件链接无异常:


​
ldd /home/yashandb_odbc/libyas_odbc.so
ldd /home/yashandb_client/lib/libyascli.so.0​

说明驱动本身无问题,系统路径也是通的。

二、问题根因分析

这个问题的本质在于:

php-fpm 服务进程启动时并未加载包含 ODBC 驱动路径的环境变量

原因如下:

使用 systemctl 启动的 php-fpm 默认不会读取 shell 环境变量;

导致 php-fpm 的工作线程找不到驱动库中的 .so 文件;

而 isql 是手动执行命令,继承了当前 shell 的环境变量,因此可以正常使用。

三、解决方案

方案一:通过 EnvironmentFile 引入环境变量文件(推荐)

1、修改服务文件:

`vi /lib/systemd/system/php-fpm.service
​`

2、在 [Service] 块中添加一行:

EnvironmentFile=/etc/sysconfig/php-fpm​
3、创建环境变量配置文件 /etc/sysconfig/php-fpm:

​
LD_LIBRARY_PATH=/usr/lib:/usr/lib64:/home/yashandb_odbc:/home/yashandb_client/lib
export LD_LIBRARY_PATH​

4、重载并重启服务:


​
systemctl daemon-reexec
systemctl daemon-reload
systemctl restart php-fpm
​

方案二:直接在 service 文件中写入环境变量(快速)

编辑 /lib/systemd/system/php-fpm.service,在 [Service] 段添加:


Environment=LD_LIBRARY_PATH=/usr/lib:/usr/lib64:/home/yashandb_odbc:/home/yashandb_client/lib​

重载服务配置并重启服务:


systemctl daemon-reload
systemctl restart php-fpm
​

四、影响范围
image.png

五、总结建议

image.png


数据库砖家
1 声望0 粉丝