注册
Linux+Apache+PHP+达梦数据库环境问题处理记录
专栏/LeeWen的铺子/ 文章详情 /

Linux+Apache+PHP+达梦数据库环境问题处理记录

LeeWen 2021/08/02 2537 4 0
摘要 记录Linux上配置Apache PHP+DM环境遇到的一些问题以及相应处理办法

环境说明

操作系统:Centos 7
Apache:2.4.6
PHP:5.4.16
达梦数据库:DM V8 1-2-38

php7版本连接达梦数据库参考:
PHP | 达梦技术社区文档 (eco.dameng.com)
达梦E学公众号:php7.4连接DM数据库环境搭建

环境安装

略(可以直接yum安装或者源码编译安装Apache和PHP,达梦数据库软件安装参考达梦技术社区相关文档)
防火墙和SELINUX,可以提前放开相应策略或者关闭

配置PHP加载达梦驱动

(1)首先拷贝达梦数据库PHP接口驱动文件到php服务器上,达梦数据库PHP驱动存放在数据库安装目录下drivers/php_pdo目录下

image-20210802113613523

需要注意,如果PHP版本是TS版,需要选择对应的TS版本的达梦数据库dm php和dm pdo驱动库文件。拷贝对应驱动文件到php默认的扩展模块路径下。

使用yum安装的自带的PHP,默认扩展模块的路径为/usr/lib64/php/modules,可以将对应版本的驱动文件拷贝到/usr/lib64/php/modules下。也可以在php.ini中指定扩展模块的路径。

默认扩展模块路径查看: php -i|grep -i extension_dir

(2)修改PHP配置文件php.ini,添加达梦数据库模块库文件

方式1:

php.ini文件中添加:

extension=libphp54_dm.so

/etc/php.d/pdo.ini文件中添加:

extension=php54_pdo_dm.so
##不要添加在最上面

方式2:

在/etc/php.d目录下,创建两个达梦驱动配置文件dm8.ini和pdo_dm8.ini,分别配置达梦php驱动扩展和pdo驱动扩展。

[root@localhost php.d]# pwd
/etc/php.d
[root@localhost php.d]# cat dm8.ini 
extension=libphp54_dm.so

[root@localhost php.d]# cat pdo_dm8.ini 
extension=php54_pdo_dm.so

(3)配置LD_LIBRARY_PATH环境变量

##临时生效:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64:/opt/dmdbms/bin
##永久生效,添加到/etc/profile配置文件中

(4)检查dm扩展模块

方法1:通过php -m命令查看

image-20210802142432498

方法2:重启httpd服务,然后通过前面的index.php测试页面查看

image-20210802172151751

image-20210802172227636

测试连接达梦数据库

新建一个测试php页面:

[root@localhost html]# pwd
/var/www/html
[root@localhost html]# cat test.php 
<?php
try {
$link = dm_connect("192.168.15.35", "SYSDBA", "SYSDBA") or die("Could not connect : " . dm_error());
print "Connected successfully!数据库版本为\n";
$query = "select *,id_code from v\$version where rownum=1;";
$result = dm_query($query) or die("Query failed : " . dm_error());
while ($line = dm_fetch_array($result, DM_ASSOC)) {
foreach ($line as $col_value) {
print_r ($col_value);
}
}
dm_free_result($result);
dm_close($link);
}
catch(PDOException $e){
   print( "Error: " . $e->getMessage())."\n";
}
?>

通过访问IP/test.php,测试是否连接数据库成功

image-20210802175538278

问题处理

报错1 PHP Startup: Unable to load dynamic library

pdo模块加载失败

[root@localhost ~]# php -v
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/php54_pdo_dm.so' - /usr/lib64/php/modules/php54_pdo_dm.so: undefined symbol: php_pdo_register_driver in Unknown on line 0
PHP 5.4.16 (cli) (built: Apr  1 2020 04:07:17) 

处理办法:

方法1:在php 5.4版本中,pdo扩展配置文件在/etc/php.d/pdo.ini,将dm php pdo驱动添加到pdo.ini文件中

[root@localhost php.d]# cat pdo.ini
; Enable pdo extension module
extension=pdo.so
extension=php54_pdo_dm.so

##注意extension=pdo.so要放到最上面

方法2:在/etc/php.d目录下,创建两个达梦驱动配置文件dm8.ini和pdo_dm8.ini,分别配置达梦php驱动扩展和pdo驱动扩展。

[root@localhost php.d]# cat pdo_dm8.ini 
extension=php54_pdo_dm.so

报错2 PHP Fatal error:Unable to start dm module

[root@localhost php.d]# php -m
PHP Fatal error:  Unable to start PDO_DM module in Unknown on line 0
或者
[root@localhost lib64]# php -m
PHP Fatal error:  Unable to start dm module in Unknown on line 0

处理办法:

方法1:LD_LIBRARY_PATH环境变量,指定为达梦数据库软件安装目录下的bin目录

##临时生效:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/dmdbms/bin
##永久生效,添加到/etc/profile配置文件中

方法2:见报错3的处理办法。

报错3 PHP正常,httpd服务启动报错

某些环境下(php 5.*)php -m可以看到已正常加载dm和PDO_DM扩展模块,但是重启httpd服务时报错,httpd的error_log中报错信息如下:

[root@localhost bin]# systemctl start httpd
Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.

###httpd error_log报错信息:
PHP Fatal error:  Unable to start dm module in Unknown on line 0

这个很奇怪,因为单独使用php查看相关扩展模块的情况都是成功的,而且使用php测试连接数据库也是正常的,但是启动httpd服务就会报错。

初步判断可能是httpd服务启动时用户环境变量加载动态链接库出现问题。

处理办法:

(1)在/etc/ld.so.conf.d目录下创建dm8.conf配置文件:

[root@localhost ld.so.conf.d]# cat dm8.conf 
/opt/dmdbms/bin

(2)root执行ldconfig命令生效

[root@localhost ld.so.conf.d]# ldconfig 
ldconfig: /opt/dmdbms/bin/libxerces-c-3.1.so is not a symbolic link
##这个报错可以忽略

(3)然后启动httpd服务

[root@localhost ld.so.conf.d]# systemctl restart httpd
[root@localhost ld.so.conf.d]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1180/sshd           
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1186/cupsd          
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1437/master         
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      3614/sshd: root@pts 
tcp        0      0 127.0.0.1:6011          0.0.0.0:*               LISTEN      3916/sshd: root@pts 
tcp        0      0 127.0.0.1:6012          0.0.0.0:*               LISTEN      4809/sshd: root@pts 
tcp        0      0 127.0.0.1:6013          0.0.0.0:*               LISTEN      4954/sshd: root@pts 
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      700/rpcbind         
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1433/dnsmasq        
tcp6       0      0 :::22                   :::*                    LISTEN      1180/sshd           
tcp6       0      0 ::1:631                 :::*                    LISTEN      1186/cupsd          
tcp6       0      0 ::1:25                  :::*                    LISTEN      1437/master         
tcp6       0      0 ::1:6010                :::*                    LISTEN      3614/sshd: root@pts 
tcp6       0      0 ::1:6011                :::*                    LISTEN      3916/sshd: root@pts 
tcp6       0      0 ::1:6012                :::*                    LISTEN      4809/sshd: root@pts 
tcp6       0      0 ::1:6013                :::*                    LISTEN      4954/sshd: root@pts 
tcp6       0      0 :::111                  :::*                    LISTEN      700/rpcbind         
tcp6       0      0 :::80                   :::*                    LISTEN      53798/httpd    ---->已启动

同报错3的还有启动php-fpm服务启动报错加载
phpfpm服务启动报错.png
处理办法与报错3相同。

报错4 页面访问报错 Create SOCKET connection failure

页面访问报错:

Error: SQLSTATE[HY000] dpi_login: -70028 Create SOCKET connection failure 
或者
Could not connect : Create SOCKET connection failure

处理办法:

1、通过index.php测试phpinfo可以正常访问,但是访问数据库报错

2、查看Apache的error_log

发现有如下输出:

[core:notice] [pid 2122] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0

初步判断可能是由于selinux开启导致。

(1)检查selinux状态

[root@localhost ~]# getenforce 
Enforcing

##Enforcing表示已开启应用SELINUX策略

(2)执行setenforce 0 设置为Permissive模式,永久生效需要修改/etc/selinux/config 文件并重启

[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce 
Permissive

##Permissive表示只记录违反策略的操作不会拒绝

(3)也可以设置为disabled完全禁用SELINUX

修改/etc/selinux/config ,将SELINUX设置为disabled,重启生效。

SELINUX=disabled

3、再访问地址,可以正常访问数据库

image-20210802175538278

报错5 php页面访问数据库报错:Could not connect : Encryption module failed to load

页面访问报错:Could not connect : Encryption module failed to load

image-20210804154710324

处理办法:

(1)确认Apache和PHP是否正常

防火墙和SELINUX均关闭。

通过访问phpinfo 测试界面确认,Apache和php均正常。

image-20210804155328550

(2)检查/usr/lib64下是否缺失libcrypto.so动态链接库

[root@localhost ~]# cd /usr/lib64/
[root@localhost lib64]# ls -l libcrypto.so
ls: cannot access libcrypto.so: No such file or directory

(3)如果缺失/usr/lib64下缺失libcrypto.so库文件,可以使用/opt/dmdbms/bin/下的libcrypto.so文件,手动在/usr/lib64下创建libcrypto.so软链接。或者直接将/opt/dmdbms/bin下的libcrypto.so文件拷贝到/usr/lib64下

[root@localhost lib64]# ln -s /opt/dmdbms/bin/libcrypto.so libcrypto.so
[root@localhost lib64]# ls -l libcrypto.so
lrwxrwxrwx. 1 root root 28 Aug  4 13:34 libcrypto.so -> /opt/dmdbms/bin/libcrypto.so

(4)重启httpd服务,访问正常

[root@localhost ]# systemctl restart httpd

image-20210802175538278

报错6 添加dm相关扩展后,php -m 输出pdo_sqlite、curl动态库加载报错

[root@xxxxx ~]# php -m
PHP Warning:  PHP Startup: Unable to load dynamic library 'curl' (tried: /usr/lib64/php/modules/curl (/usr/lib64/php/modules/curl: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/curl.so (/usr/lib64/php/modules/curl.so: undefined symbol: curl_mime_type)) in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo_sqlite' (tried: /usr/lib64/php/modules/pdo_sqlite (/usr/lib64/php/modules/pdo_sqlite: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/pdo_sqlite.so (/usr/lib64/php/modules/pdo_sqlite.so: undefined symbol: sqlite3_column_table_name)) in Unknown on line 0
[PHP Modules]
bz2
calendar
Core
ctype
date
DM
dom
exif
fileinfo
filter
ftp
gettext
hash
iconv
json
libxml
mbstring
openssl
pcntl
pcre
PDO
PDO_DM
Phar
readline
Reflection
session
SimpleXML
sockets
SPL
sqlite3
standard
tokenizer
wddx
xml
xmlreader
xmlwriter
xsl
Zend OPcache
zlib

处理办法
将LD_LIBARARY_PATH环境变量配置时,将/usr/lib64添加到$DM_HOME/bin前面。
如下:

[root@xxxxx ~]# cat /etc/profile|grep DM_HOME
export DM_HOME=/opt/dmdbms
export LD_LIBRARY_PATH=/usr/lib64:$DM_HOME/bin:$DM_HOME/drivers/php_pdo:$LD_LIBRARY_PATH
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服