PHP

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 版本达梦公司目前驱动不支持怎么办?

  1. 向达梦公司提需求;
  2. 如果是在客户现场,需求比较急,客户的安装 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 均正常,能访问则表示端口服务均正常。
    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 目录。

微信扫码
分享文档
扫一扫
联系客服