操作系统: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,可以提前放开相应策略或者关闭
(1)首先拷贝达梦数据库PHP接口驱动文件到php服务器上,达梦数据库PHP驱动存放在数据库安装目录下drivers/php_pdo目录下
需要注意,如果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命令查看
方法2:重启httpd服务,然后通过前面的index.php测试页面查看
新建一个测试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,测试是否连接数据库成功
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
[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的处理办法。
某些环境下(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服务启动报错加载
处理办法与报错3相同。
页面访问报错:
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、再访问地址,可以正常访问数据库
页面访问报错:Could not connect : Encryption module failed to load
处理办法:
(1)确认Apache和PHP是否正常
防火墙和SELINUX均关闭。
通过访问phpinfo 测试界面确认,Apache和php均正常。
(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
[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
文章
阅读量
获赞