达梦数据库端口监听需用netstat或ss确认,默认5236,若无输出则服务未启动或端口被修改;还需检查防火墙、SELinux、云安全组、pdo_dameng扩展加载及连接字符串格式,并通过SQLCODE定位具体错误。
netstat 或 ss 确认PHP 连不上达梦,第一反应

5236,但可能被修改过。
netstat -tuln | grep 5236(Linux)或 ss -tuln | grep 5236
dm.ini 中的 PORT_NUM 值DmServiceXXX,可用 ps -ef | grep DmService 确认是否运行即使端口监听了,也可能被系统级策略拦截:
systemctl status firewalld 查状态,若启用需放行端口:firewall-cmd --permanent --add-port=5236/tcp,再重载getenforce 查模式,若为 Enforcing,临时设为 permissive 测试:setenforce 0;长期方案需添加端口上下文:semanage port -a -t dm_port_t -p tcp 5236
5236 TCP 端口pdo_dameng 扩展是否装对了?达梦官方不提供标准 PDO 驱动,主流方式是使用达梦自带的 pdo_dameng 扩展(基于 DM8 客户端库):
php -m | grep dameng,或 phpinfo() 页面搜 pdo_dameng
libdmdpi.so(Linux)或 dmdpi.dll(Windows)路径已加入 LD_LIBRARY_PATH(Linux)或 PATH(Windows)dameng:server=192.168.1.100;port=5236;database=MYDB;uid=SYSDBA;pwd=SYSDBA —— 注意不是 mysql: 或 oci: 风格telnet host 5236 成功只说明网络层通,不代表达梦协议层可交互:
ini_set('display_errors', 1); error_reporting(E_ALL);
try { $pdo = new PDO($dsn, $user, $pass); } catch (PDOException $e) { echo $e->getMessage(); }
SQLCODE: -2601 → 用户名/密码错误或账户被锁SQLCODE: -2701 → 数据库名不存在或未挂载SQLCODE: -2614 → 协议版本不匹配(PHP 扩展与达梦服务端版本不兼容,比如用 DM7 扩展连 DM8)达梦的协议握手细节多,版本错配、字符集不一致、甚至客户端 IP 被 dm_svc.conf 限制,都可能导致“端口通但连不上”。先盯住 SQLCODE,它比“Connection refused”有用得多。