PHP 连接数据库提示“加密模块加载失败”
- 确认 Apache 服务正常
通过访问 phpinfo 测试界面确认,Apache 和 php 均正常
- 配置 extension_dir 指向达梦安装目录 dirvers 目录的 php_pdo 驱动目录;
举例:配置 extension_dir = /home/dmdba/dmdbms/drivers/php_pdo
- 配置环境变量指向安装目录的 bin 目录。
- 检查/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
如果缺失/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
- 重启服务器。
ubuntu 系统 php 连不上达梦数据库
- 首先通过 ./php -info 查看模块加载是否成功?
- 其次检查 php 的配置文件 php.ini,检查扩展是否设置正确,如:extension_dir = "/opt/php/lib" --可以将达梦的 php 驱动包拷贝到 /opt/php/lib 下,extension = php71_pdo_dm.so --注意这里是 php7.1.33 NTS(非线程安全版),需要选对驱动版本。
- 最后要检查用户环境变量,要设置正确。比如:vim /home/dmdba/.bash_profile export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/dmdba/dmdbms/bin"
PHP 客户如何了解自己下载的 PHP 版本?哪里下载?
未安装用户:进入:https://www.php.net 可下载,安装包有对应版本号。建议使用达梦已支持的版本。
已安装用户,若已经配置好环境变量,可直接通过 php -v 命令查询 PHP 版本。若未配置环境变量,则需要在命令行中进入到 PHP 的安装目录后,执行 php -v 命令进行查询。
客户下载的 PHP 版本是否在达梦所支持的范围内
进入达梦云适配中心下载试用下载最新的数据库,安装后可以在安装目录 drivers 目录下看到 php 的驱动。例如:
PHP 版本达梦公司目前驱动不支持怎么办?
- 向达梦公司提需求;
- 如果是在客户现场,需求比较急,客户的安装 PHP 版本高于达梦现在支持的驱动版本,可以考虑用 ODBC 进行中转。
PHP Fatal error: Unable to start PDO_DM module in Unknown on line 0
需要设置环境变量,设置方法如下:
配置环境变量(全局/局部)。需确认环境变量生效,Windows 不生效可尝试重启操作系统。
验证模块加载成功(无报错,能查看到相关模块情况)。
若上述解决方法,还无法解决,请尝试以下办法:
- 环境变量 LD_LIBRARY_PATH 设置只能解决某个用户问题,应在系统级别加载包路径。假设在安装达梦数据库软件时选择的安装路径是 /opt/dmdbms,它的 bin 目录为 /opt/dmdbms/bin,进入到目录 cd /etc/ld.so.conf.d,新建一个 dm.conf,把 /opt/dmdbms/bin 路径写入到 dm.conf,保存退出,然后 ldconfig,记得 root 执行,如果更换目录,记得 dm.conf 中写入达梦实际安装目录 /bin,然后重启 php-fpm
在/etc/ld.so.conf.d 目录下创建 dm8.conf 配置文件:
[root@localhost ld.so.conf.d]# cat dm8.conf
/opt/dmdbms/bin
root 执行 ldconfig 命令生效
[root@localhost ld.so.conf.d]# ldconfig
ldconfig: /opt/dmdbms/bin/libxerces-c-3.1.so is not a symbolic link ##此报错可以忽略
重启 httpd 服务
- 建议检查 PHP.INI,包括驱动和 SO 动态库等配置。
备注达梦数据库和 web 应用不在一台服务上,把需要的达梦的 pdo 文件复制过去,再配置 php.ini,ldd 看看是否缺依赖的 lib。
PHP Fatal error: Uncaught Error: Call to undefined function dm_query()
【问题原因】:
- PHP 版本更新导致此报错。
- PHP5.6 不会报这个错,PHP7.1 会报这个错。
例如:如果你拿 PHP7.1 去跑 PHP5.6 配置的脚本,就会报错。
【解决方法】:
将 dm_query 改成 dm_exec。
注意Php7.x 用dm_exec 代替本扩展,自 PHP 5.5.0 起已废弃,并在自 PHP 7.0.0 开始被移除。
由此引申:
- 如果 PHP Fatal error: Uncaught Error: Call to undefined function dm_connect(),有可能是 php.ini 没配置或者驱动没加载成功。
- 如果在操作中碰到 Insert, update 的其他操作报类似于这种错,可以网上查询 MySQL。
PHP Warning: PHP Startup: DM: Unable to initialize module
【问题原因】:
VC 或者 (ts/nts) 版本不匹配
【解决方法】:
下载和达梦的 VC/(ts/nts) 版本匹配的 PHP 安装文件。可查看 php 配置信息(Thread Safety),如果是 enable 即为 ts 版本(Thread Safety)
PHP Startup: Unable to load dynamic library
【问题原因】:
- 达梦的 php 驱动文件没有拷贝进 PHP 的 ext 文件夹里。
- 写进 php.ini 里面的驱动名称,和从达梦拷贝进 ext 文件的驱动名称不一致。
- 下载的 PHP 版本 TS/NTS 和达梦数据库不匹配,TS 的依赖库和 NTS 的依赖库是不一样的,于是显示找不到 .dll 或.so 文件。
- 将 extension_dir = "ext" 前面的
;
去掉,这个路径根据自己的 PHP 文件的路径配置修改。 - 未设置依赖文件 libdmdpi.so 的环境变量
【解决方法】:
- Windows 下:
解压 PHP 程序,复制和配置 php.ini。
拷贝驱动到对应的扩展目录下。
配置扩展目录,配置数据库扩展模块。
- Linux 下:
拷贝驱动至目录 /usr/lib64/php/modules,设置达梦软件安装目录到 LD_LIBRARY_PATH,配置具体的 dm 数据库 pdo 扩展,有两种方法,以下说明:
方法一:
pdo 扩展配置文件在/etc/php.d/pdo.ini,将 dm php pdo 驱动添加到 pdo.ini 文件中,内容如下:
extension=pdo.so
extension=php54_pdo_dm.so
extension=libphp54_dm.so
注意extension=pdo.so要放到最上面
方法二:
在/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
php -m 命令报错段错误
libcrypto.so 文件可能冲突,重命名。
报错:fatal error: Python.h: No such file or directory
这时是因为缺少 python-devel 包导致的,可以使用 yum 进行安装解决,yum 源的配置,请参考 Linux 平台下 yum 源配置
php 连接达梦,select FROM_UNIXTIME ('1620693231','YYYY-MM-DD %h:%i:%s'); 时间不对
检查 dm_svc.conf 是否添加了时区 TIME_ZONE=(480)的配置,检查服务器时间是否正确
运行 php 程序时,bindValue 报错
【问题说明】:
PHP 版本为 7.2,数据库版本为 8.1.1.126
具体报错信息如下:Error occurred when binding parameters ':ThinkBind_1_2054953456_'
【解决方法】:
替换 libphp72_dm.so、php72_pdo_dm.so 为 DM8.1.1.144 以上高版本。
PHP 页面访问数据库报错:Could not connect : Create SOCKET connection failure
【问题描述】:
Centos7 上配置好 Apache+php+ 达梦数据库环境,测试页面地址浏览器访问报错:
Could not connect : Create SOCKET connection failure
或者
Error: SQLSTATE[HY000] dpi_login: -70028 Create SOCKET connection failure
【解决方法】:
- 确认 Apache 服务正常
通过访问 phpinfo 测试界面确认,Apache 和 php 均正常,能访问则表示端口服务均正常。
- 查看 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
- 再访问地址,可以正常访问数据库
php 使用 PDO 连接达梦出现中文乱码
【问题描述】:
数据库初始化为 UTF8 编码,在达梦所在服务器 dm_svc.conf 配置文件设置了 utf8 编码,PDO 也设置了 UTF8 编码,但仍然在 utf8 编码下出现乱码。
【问题解决】:
通过设置应用端的 dm_svc.conf 文件,设置 CHAR_CODE 的值:(PG_UTF8),修改完后重启 fpm 即可。
如果应用端没有安装达梦数据库,可以从安装达梦数据库所在服务器如下目录去拷贝 dm_svc.conf 文件,或者可以在应用端自行创建 dm_svc.conf 文件放在如下目录。
安装达梦数据库所在服务器 dm_svc.conf 文件默认路径:
32 位的 DM 安装在 Win32 操作平台下,此文件位于 %SystemRoot%\system32 目录;
64 位的 DM 安装在 Win64 操作平台下,此文件位于 %SystemRoot%\system32 目录;
32 位的 DM 安装在 Win64 操作平台下,此文件位于 %SystemRoot%\SysWOW64 目录;
在 Linux 平台下,此文件位于/etc 目录。