PHP 引入达梦(DM)扩展 .so
一、添加达梦运行环境变量(必须)
1️⃣ 设置系统环境变量
|
1 2 3 4 5 6 7 8 9 |
# DM_HOME=/home/dmdba/dmdbms 是达梦数据库的安装目录 cat >> /etc/profile << 'EOF' export DM_HOME=/home/dmdba/dmdbms export PATH=$DM_HOME/bin:$PATH export LD_LIBRARY_PATH=$DM_HOME/bin:$DM_HOME/lib:$LD_LIBRARY_PATH EOF source /etc/profile |
2️⃣ 确认生效
|
1 2 |
echo $DM_HOME ldd $DM_HOME/bin/dmserver | grep libdm |
二、确认 PHP 是否是 TS / NTS(关键)
执行:
|
1 2 3 |
#/usr/local/lib/php/7.3/bin/php 是php 的安装目录 /usr/local/lib/php/7.3/bin/php -n -i | grep -i "Thread Safety" |
判断规则:
| 输出结果 | 使用的 so |
|---|---|
| Thread Safety => disabled | ❗ 不带 ts 的 so |
| Thread Safety => enabled | 使用 ts 的 so |
示例:
|
1 |
Thread Safety => disabled |
👉 必须使用:
|
1 2 |
libphp73_dm.so php73_pdo_dm.so |
❌ 不能用:
|
1 2 |
libphp73ts_dm.so php73ts_pdo_dm.so |
三、找到正确的达梦 so 文件路径
达梦官方 so 目录通常在:
|
1 |
/home/dmdba/dmdbms/drivers/php_pdo/ |
PHP 7.3 + NTS 对应文件:
|
1 2 |
libphp73_dm.so php73_pdo_dm.so |
快速确认:
|
1 |
ls /home/dmdba/dmdbms/drivers/php_pdo | grep php73 |
四、配置 php.ini 引入 so(推荐绝对路径)
编辑 php.ini
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# 引入so文件 绝对路径 extension=/home/dmdba/dmdbms/drivers/php_pdo/libphp73_dm.so extension=/home/dmdba/dmdbms/drivers/php_pdo/php73_pdo_dm.so # 引入so文件 extension_dir 方式 不推荐 #extension_dir ="/home/dmdba/dmdbms/drivers/php_pdo" #extension=libphp73_dm.so #extension=php73_pdo_dm.so # 达梦数据库相关配置 [dm] dm.port=5236 ; ; 是否允许持久性连接 dm.allow_persistent = 1 ; ; 允许建立持久性连接的最大数. -1 为没有限制. dm.max_persistent = -1 ; ; 允许建立连接的最大数(包括持久性连接). -1 为没有限制. dm.max_links = -1 ; ; 默认的主机地址 dm.default_host = localhost ; ; 默认登录的数据库 dm.default_db = SYSTEM ; ; 默认的连接用户名 dm.default_user = SYSDBA ; ; 默认的连接口令. dm.default_pw = ***** ; ;连接超时,这个参数未实际的用到,等待服务器支持 dm.connect_timeout = 10 ; ;对于各种变长数据类型,每列最大读取的字节数。如果它设置为 0 或是小于 0,那么,读取变长字段时,将显示 NULL 值 dm.defaultlrl = 4096 ; ; 是否读取二进制类型数据,如果它设置为 0,那么二进制将被 NULL 值代替 dm.defaultbinmode = 1 ; ;是否允许检察持久性连接的有效性,如果设置为 ON,那么当重用一个持久性连接时,会检察该连接是否还有效 dm.check_persistent = ON |
⚠️ 顺序不能反
-
DM
-
PDO_DM
五、验证 so 文件依赖是否正常
|
1 |
ldd /home/dmdba/dmdbms/drivers/php_pdo/libphp73_dm.so | grep not |
六、命令行验证(不走 php.ini)
|
1 2 3 4 |
/usr/local/lib/php/7.3/bin/php -n \ -d extension=/home/dmdba/dmdbms/drivers/php_pdo/libphp73_dm.so \ -d extension=/home/dmdba/dmdbms/drivers/php_pdo/php73_pdo_dm.so \ -m | grep -E 'DM|PDO' |
期望输出:
|
1 2 3 |
DM PDO PDO_DM |
七、php-fpm 使用环境变量(非常重要)
/etc/profile 对 php-fpm 不生效
方法一(推荐):在 pool 中加 env
|
1 2 3 4 |
# /usr/local/lib/php/7.3/etc/php-fpm.d/www.conf env[DM_HOME] = /home/dmdba/dmdbms env[LD_LIBRARY_PATH] = /home/dmdba/dmdbms/bin:/home/dmdba/dmdbms/lib |
重启:
|
1 |
systemctl restart php-fpm-7.3.service |
八、最终验证
|
1 |
/usr/local/lib/php/7.3/bin/php -m | grep -E 'DM|PDO' |
期望输出:
|
1 2 3 |
DM PDO PDO_DM |