在使用 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
四、影响范围
五、总结建议
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。