尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

PHP连接达梦数据库全流程:从安装扩展到跑通首个查询

发布时间:2026/9/29 17:59:02

资讯中心
01
ARTICLE

PHP连接达梦数据库全流程:从安装扩展到跑通首个查询

PHP连接达梦数据库全流程:从安装扩展到跑通首个查询
最近接手一个老项目的国产化适配数据库从原来的一套闭源商业库整体切换到达梦DM。说实话对做PHP的人来说连达梦这趟水比想象中要浑很多——网上资料七零八落很多还停留在“能启动”的阶段真正讲到“PHP怎么连”的少之又少。我前后折腾了一整天踩了扩展版本不匹配、模式名不对、字符集乱码等一堆坑最后总算把安装到连接整条链路跑通。这篇就把完整过程复盘一遍从达梦装起来到PHP成功执行第一条SQL后面的人照着走能省下不少时间。这篇文章适合这几类人看正要给项目做国产数据库迁移的PHP后端团队里被分到“把达梦跑起来”任务的开发以及想了解达梦和PHP生态适配现状的DBA。我会把环境准备、安装流程、扩展编译、连接代码和故障排查全部写清楚尽量用大白话讲透。1. 达梦数据库是什么为什么PHP连它有点“拧巴”1.1 达梦的核心定位与兼容性达梦数据库DM是国产关系型数据库里的主力选手目前主流版本是DM8。它最大的特点是高度兼容Oracle语法不少项目从Oracle迁到达梦几乎可以平替SQL改动量很小。默认端口是5236默认实例名DAMENG默认超级管理员是SYSDBA这些基础信息在动手安装前最好先记住后面会反复用到。为什么现在越来越多的项目会碰到达梦原因很简单不少政企、金融、通信类项目在国产化的大趋势下明确要求数据库选型必须是国产数据库。这个趋势下达梦、人大金仓、GaussDB这类产品被大量引入。对做业务系统的团队来说技术栈里多一种数据库就得让开发、运维都能接得住。达梦本身在设计上参考了Oracle所以如果你以前写过PL/SQL、用过Oracle的函数到达梦里会很有亲切感。1.2 PHP生态连接达梦的三条路在开始安装之前有必要先搞清楚PHP连达梦有哪几条路可走因为不同路线的复杂程度和稳定性天差地别。连接方式实现路径优点缺点推荐度官方PDO扩展安装达梦自带的php_pdo_dm扩展性能最好、类型安全、写法接近PDO习惯需匹配PHP版本和线程安全模式部署略麻烦首选ODBC桥接通过PHP的ODBC驱动连接达梦ODBC驱动不依赖PHP专用扩展通用性强配置链路长、性能略差、DSN配置易出错备选中间层接口PHP请求Java/Go等写的HTTP接口由接口访问达梦绕开PHP适配问题实现最简单多一次网络跳转、延迟高、架构复杂不推荐常规使用如果你是第一次接触达梦我强烈建议直接走官方PDO_DM扩展这条路线。Java生态里比如mybatis-plus、druid、springboot连达梦的资料已经非常成熟但PHP这边官方扩展的文档零散搜出来的博客还经常互相矛盾。正因如此这篇文章会重点写PDO_DM的完整安装和连接方法。2. 先把达梦跑起来安装与初始化2.1 安装前的准备工作达梦安装包需要从达梦官网申请可以拿到ISO或ZIP格式的安装介质。注意区分平台Windows版一般是ZIP/EXELinux版是ISO或bin文件。如果你是个人学习申请试用授权就够了正常使用没问题。安装前建议先确认机器配置。内存至少4G推荐8G以上磁盘预留20G左右因为达梦安装完加上数据文件、日志文件占用的空间比想象中大。Windows环境尽量用Server版系统或Win10以上Linux建议CentOS 7/8、Ubuntu 18.04以上内核版本不要太老。还有个容易忽略的事Linux下千万不要用root用户直接安装达梦。官方要求创建一个普通用户比如dinstall然后在该用户环境下执行安装。原因很现实达梦服务进程如果以root运行存在安全隐患而且后续管理脚本对权限的判断很严格。Windows下则要注意安装路径不能有中文否则后面初始化实例时容易出幺蛾子。2.2 Windows图形化安装流程Windows下安装达梦算是最简单的路径基本是“下一步”式操作。先把ISO解压或直接挂载进入目录找到setup.exe双击启动安装向导。向导会让你选语言、接受许可协议然后进入安装类型选择。这里初学者可以直接选“典型安装”它会自动带上服务器组件、客户端组件和管理工具。如果机器上还要跑PHP和数据库共存注意别把安装目录选的太奇葩我建议就放在C:\dmdbms这种纯英文路径下。安装类型确认后向导会要求设置数据库管理员口令也就是SYSDBA的密码。这里有个细节初始密码强度要求不低而且建议设置后立刻记到密码管理工具里后面PHP连接用的就是它。接着选择“初始化实例”向导会弹出数据库配置助手的几个核心选项数据库名默认DAMENG即可不用改。实例名默认DMSERVER也可以改成业务相关名字。端口号默认5236除非被占用否则别改。字符集推荐选UTF-8这个对后面PHP中文读写非常关键。确认后等待初始化完成达梦服务会自动注册成Windows服务名称类似DmServiceDMSERVER。到这里Windows下的安装就算结束了。2.3 Linux命令行安装与静默部署Linux服务器上没有图形界面是常态所以达梦也提供了命令行安装方式。流程比Windows稍繁琐但掌握了之后反而更好批量部署。首先创建安装用户和属组groupadd dinstall useradd -g dinstall -m -d /home/dinstall dinstall passwd dinstall然后挂载ISO并切换到dinstall用户执行安装脚本mount -o loop dm8.iso /mnt su - dinstall cd /mnt ./DMInstall.bin -i脚本会进入交互式命令行安装按提示输入安装路径、选择组件即可。安装完成后脚本会提示需要用root权限执行一个配置脚本路径通常在/home/dinstall/dmdbms/script/root/root_installer.sh我在实操时习惯把这一步当成必做项漏掉会导致后续服务脚本权限异常。安装完还不够需要配置环境变量编辑/home/dinstall/.bash_profileexport DM_HOME/home/dinstall/dmdbms export PATH$DM_HOME/bin:$PATH export LD_LIBRARY_PATH$DM_HOME/bin:$LD_LIBRARY_PATH最后执行source ~/.bash_profile让环境变量生效。这里我想强调一下LD_LIBRARY_PATH一定要带上否则后面启动服务或者用disql工具时会报找不到动态库的错误很折腾。2.4 初始化实例与基本管理安装好数据库软件不等于数据库可用你必须先初始化一个实例。图形环境可以用“达梦数据库配置助手”DBCA完成Linux命令行则推荐直接用dminit工具。一个典型的dminit命令长这样dminit PATH/dm/data DB_NAMEDAMENG INSTANCE_NAMEDMSERVER PORT_NUM5236 CHARSET1 CASE_SENSITIVE0常用参数我整理成了表格方便对照参数作用建议PATH数据文件目录预先创建并给dinstall权限DB_NAME数据库名默认DAMENGINSTANCE_NAME实例名默认DMSERVERPORT_NUM监听端口5236CHARSET字符集建议1UTF-8CASE_SENSITIVE标识符大小写敏感按业务习惯0不敏感更省心初始化完成后可以用服务脚本启停数据库service DmServiceDMSERVER start service DmServiceDMSERVER statusWindows下直接在服务管理器里启动DmServiceDMSERVER即可。启动后用netstat -an | grep 5236确认端口在监听这一步确定没问题再往下走PHP连接才有意义。3. PHP连接达梦从扩展安装到首个查询3.1 连接前先确认三件事我在PHP连接达梦时翻车八成都是环境信息没对齐。开工前先执行三个命令确认PHP环境php -v php -i | grep Thread Safety php -i | grep Architecture第一看PHP版本号第二看线程安全TS还是NTS第三看位数x86还是x64。这三个信息直接决定你要用哪个达梦扩展文件。比如PHP 7.4、NTS、x64对应的扩展文件就是适配这一组组合的DLL或SO。三者任何一个对不上扩展都加载不了而且报错信息可能很隐晦。另外要注意PHP和达梦的位数建议保持一致。64位的PHP配64位的达梦驱动32位的PHP配32位的驱动混用会出现莫名其妙的内存错误这类问题排查起来比扩展加载失败还痛苦。3.2 Windows下安装PHP扩展Windows下安装官方PDO_DM扩展的步骤比较机械但每一步都不能省。首先找到安装目录下的驱动文件夹路径一般是C:\dmdbms\drivers\php_pdo。里面会按PHP版本放好一批DLL文件文件名类似php_pdo_dm_7_4_ts_x64.dll。根据前面确认的PHP版本、TS/NTS、位数挑出对应的那个。把这个DLL复制到PHP的ext目录然后编辑php.ini在动态扩展区加上extensionphp_pdo_dm_7_4_ts_x64注意不要加.dll后缀PHP会自动补全。保存后重启PHP服务如果是Apache就重启Apache如果是NginxPHP-FPM就重启php-fpm然后执行php -m | grep -i dm如果输出里能看到PDO_DM或者dm说明扩展加载成功了。如果没看到马上打开PHP错误日志通常会有“Unable to load dynamic library”这样的提示依据日志去找问题。Windows下最常见的坑有两个一是扩展DLL和PHP版本不匹配这个对照文件名就能解决二是缺少VC运行库尤其PHP是用VC15/VC16编译的机器上没装对应的Visual C Redistributable就会加载失败去微软官网装全量运行库就能解决。3.3 Linux下编译安装扩展Linux下官方驱动目录里提供的是源码需要自己编译。以PHP 7.4为例完整流程如下。先确保装了PHP开发包apt install php-dev # Debian/Ubuntu yum install php-devel # CentOS/RHEL然后进入达梦驱动目录cd $DM_HOME/drivers/php_pdo ls目录下会有一个README或者INSTALL文件务必先读一遍不同达梦版本对编译参数的要求略有不同。常见编译步骤是phpize ./configure --with-pdo_dm$DM_HOME make sudo make install编译完成后模块文件一般是pdo_dm.so会被放到PHP扩展目录。然后在php.ini中加入extensionpdo_dm.so重启PHP-FPMservice php-fpm restart # 或者 systemctl restart php7.4-fpm再用php -m确认。我编译时遇到过configure阶段报“找不到PHP配置”的情况通常是因为系统里装了多个PHP版本phpize指向的php-config路径不对。解决方案是明确指定./configure --with-php-config/usr/bin/php-config3.4 写第一个连接脚本扩展装好后写PHP代码反而是最没有悬念的一步因为它就是标准PDO玩法。?php $host 127.0.0.1; $port 5236; $user SYSDBA; $pass 你的密码; try { $dsn dm:host$host;port$port; $pdo new PDO($dsn, $user, $pass); $pdo-setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt $pdo-query(SELECT 1 FROM DUAL); $result $stmt-fetch(PDO::FETCH_ASSOC); var_dump($result); } catch (PDOException $e) { echo 连接失败: . $e-getMessage(); }这里DSN的写法是dm:host...;port...别写成mysql:或者pgsql:。达梦兼容Oracle的DUAL表所以SELECT 1 FROM DUAL这种语法可以直接用这也是验证连接是否成功最快的方式。跑通连接后建议顺手测试一下建表和中文写入因为字符集问题往往到这一步才暴露$pdo-exec(CREATE TABLE t_test(id INT, name VARCHAR(50))); $pdo-exec(INSERT INTO t_test VALUES(1, 中文测试)); $stmt $pdo-query(SELECT * FROM t_test); print_r($stmt-fetchAll(PDO::FETCH_ASSOC));如果查询结果里的中文显示正常那字符集配置这块基本可以放心了。3.5 连接参数与常用配置PDO_DM的DSN里除了host、port还可以带一些额外参数比如charset、login_timeout等。不过不同版本的驱动支持情况略有差异建议以官方README为准。最稳妥的做法还是在初始化实例时就把字符集定成UTF-8然后PHP业务侧也统一UTF-8这样两端默认一致省去一堆麻烦。另一个必须掌握的概念是模式Schema。在达梦里用户的默认模式一般和用户名相同比如SYSDBA用户对应的模式就是SYSDBA。如果你连接后直接查SELECT * FROM 业务表数据库会去当前用户默认模式里找找不到就报“表或视图不存在”。这种情况下有两个解决办法。第一个是在表名前显式加上模式前缀SELECT * FROM 业务模式.业务表;第二个是在连接建立后切换会话模式$pdo-exec(SET SCHEMA 业务模式);这个坑我后面在故障排查部分还会详细讲因为它是新手连达梦时最容易撞上的错误。3.6 先用图形工具验证连通性在动PHP之前我强烈建议先用图形化管理工具连一次达梦把“数据库本身是否可用”和“PHP代码是否正常”这两个问题隔离开来。Navicat从15版本开始支持达梦数据库新建连接时选择“达梦数据库”类型填主机、端口、用户名、密码即可和连MySQL的操作几乎一样。如果你用的是DBeaver需要先下载达梦的JDBC驱动并配置到驱动管理器里稍麻烦一些但也是可行的。这一步的排查价值很大如果Navicat能连上、能查数据说明达梦服务和账号都没问题那PHP连不上就是PHP侧的问题反过来如果Navicat也连不上就别在PHP上浪费时间先回头查数据库服务状态、端口监听和防火墙。4. 常见问题与排查技巧实录4.1 扩展加载失败日志和版本匹配我在Windows上第一次装PHP扩展时重启Apache后直接页面500错误日志里写着PHP Warning: PHP Startup: Unable to load dynamic library php_pdo_dm.dll原因是达梦给的DLL目录里有十几个文件我随手挑了一个没看PHP的TS/NTS信息结果选成了TS版本。后来换成NTS版本立即正常。所以遇到扩展加载失败第一反应不应该是重装扩展而是重新核对PHP版本、TS/NTS、位数三个信息。还有一种情况是把DLL复制进了ext目录php.ini里也加了但就是加载不了这多半是缺少VC运行库。Windows下建议直接安装“Visual C Redistributable for Visual Studio”最新版合集装完再重启PHP。Linux下则检查扩展编译时的PHP版本和当前运行版本是否一致比如用phpize编译时的PHP是7.4但运行环境的PHP是8.0那大概率加载失败。4.2 连接失败端口、服务与防火墙PHP连接达梦最常见的报错是SQLSTATE[HY000] [2002] Connection refused或者SQLSTATE[HY000] PDO::__construct(): PDO_DM: unable to connect这类问题的排查顺序我建议固定下来能少走很多弯路确认达梦服务还在运行service DmServiceDMSERVER status确认端口在监听netstat -an | grep 5236确认远程访问时防火墙放行了5236firewall-cmd --list-all最后才去看PHP代码里的host、port、用户名、密码对不对有个小技巧在命令行直接执行telnet 127.0.0.1 5236能通说明数据库层没问题问题在PHP侧不通就去查数据库服务。我在实际项目里发现很多“PHP连不上达梦”最终都是防火墙没放行或者达梦服务只监听了127.0.0.1而没监听内网IP导致远程机器连不上。4.3 “模式错误”与表或视图不存在前文提到达梦里“模式”的概念和Oracle很像。报错一般长这样SQLSTATE[42000]: [DM]Invalid schema name: 某个名称或者SQLSTATE[42S02]: [DM]Table or view XXX does not exist新手最容易困惑的是我的SQL在数据库工具里明明能查为什么PHP里就报表不存在原因是你在数据库工具里连接时用的用户就是当前模式而PHP连接用的是SYSDBA。举个例子业务表建在APPUSER模式下你用APPUSER登录当然直接能查但PHP用SYSDBA登录查询时SQL里写的是裸表名数据库就去找SYSDBA模式下有没有这张表——肯定没有。解决办法就是前面说的那两种模式名.表名或者连接后执行SET SCHEMA 模式名。在我自己的项目里我一般会在数据库连接建立后统一执行一次SET SCHEMA这样不用改所有SQL降低迁移成本。$pdo-exec(SET SCHEMA APPUSER);4.4 中文乱码初始化字符集是源头中文乱码这种问题在达梦里尤其坑因为它的字符集设置在初始化实例时就定死了后面想改非常麻烦。如果你用PHP往达梦插入中文后查询出来是问号或者一堆乱码先做三件事确认实例初始化时选择的字符集。在安装时如果你选了GB18030而PHP业务侧是UTF-8两端不一致就会乱码。确认PHP文件本身保存为UTF-8无BOM格式。这个细节看着不起眼但很多编辑器默认保存成GBK直接导致中文乱码。确认HTTP响应头声明了UTF-8编码。我在实操中最稳妥的方案是初始化实例时直接选UTF-8PHP侧全部用UTF-8彻底统一编码后面几乎不会再踩乱码的坑。已经初始化完才发现字符集不对怎么办说实话如果测试数据还没多少我建议重新初始化一个UTF-8的实例别硬着头皮在GB18030上做业务后续耦合的问题会越来越多。4.5 性能初步优化与连接复用达梦的连接开销比MySQL要重一些PHP每次请求都新建连接会明显影响性能。一个立竿见影的做法是开启PDO长连接$pdo new PDO($dsn, $user, $pass, [ PDO::ATTR_PERSISTENT true ]);长连接能复用底层连接减少握手和认证开销。但长连接也有它的坑如果数据库重启或网络闪断PHP侧可能拿到失效连接所以使用长连接时需要配合异常捕获和重连逻辑不能无脑开启。查询性能方面达梦的SQL优化思路和Oracle很像。给大表查询字段建索引是第一位其次是避免在WHERE条件里使用函数比如WHERE TO_CHAR(create_time) 2024-01-01这种写法会让索引失效应该改成范围查询。如果你是从MySQL迁移过来的有些函数要特别注意比如LIMIT分页在达梦里不生效需要换成Oracle风格的ROWNUM或FETCH FIRST子句不然分页查出来数据不对甚至直接报错。最后再给一个经验之谈数据库服务刚装好时别急着调各种高级参数先把数据页大小、字符集、大小写敏感这三个初始化参数定好因为这三个在后期是“改起来要人命”的选项。大内存机器上可以把数据页大小设成16或32KB能改善大字段和大表的IO性能但前提是你一开始就规划好。这次实操下来最大的体会是连达梦最大的障碍不是技术难度而是信息不对等。官方文档其实都写了但散布在安装手册、README和论坛帖子里新手很难一次拼出完整路线。我的建议是——先图形化工具连上数据库再装PHP扩展最后写代码每一步都验证过再走下一步一次只改一个变量这样出了问题能立刻定位。另外达梦安装目录下的drivers文件夹是个宝藏里面除了PHP驱动还有JDBC、Python、C等语言的驱动和示例代码值得花时间翻一翻。按照这篇文章的步骤走下来从零到跑通第一个PHP查询我预计熟练的话半天内搞定。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。