PHP 7连接Ingres数据库失败:fsockopen参数适配求助
解决PHP通过PJBridge连接VMS上Ingres数据库的端口问题
你现在遇到的核心问题是把Ingres在VMS上的服务别名II7和fsockopen()需要的整数TCP端口搞混了,咱们一步步理清逻辑,解决这个问题:
1. 先明确PJBridge的工作模式
PJBridge作为JDBC-PHP桥,必须配合Java服务端程序才能工作:
- 你需要在能访问Ingres数据库的机器(比如你的VMS服务器)上启动PJBridge的Java服务端,这个服务会监听一个你指定的整数TCP端口(比如1234)。
- PHP端的
PJBridge类通过fsockopen()连接到这个Java服务端的端口,再由Java服务端去对接Ingres数据库(这时候才会用到Ingres的服务别名II7)。
2. 找到Ingres服务对应的实际TCP端口(给Java服务端用)
你的JDBC连接字符串jdbc:ingres://vnode:II7/dbname里的II7是VMS上Ingres的服务别名,要让Java服务端能识别它,你可以在VMS上执行以下操作查找对应的TCP端口:
- 运行
INGPRENV命令,查看II_TCP_PORT环境变量,这是Ingres默认的TCP端口(通常是1521,不过可能被修改过)。 - 或者用VMS的
NETSTAT /ALL | SEARCH II7命令,直接查找Ingres服务监听的端口号。
3. 修正PHP代码的关键错误
你的代码里直接把II7当成了fsockopen()的端口,这是错误的。需要调整为连接Java服务端的整数端口:
<?php require "lib/PJBridge.php"; function get_connection() { // 这个connStr是给Java服务端用的,用来连接Ingres数据库 $connStr = "jdbc:ingres://vnode:II7/dbname"; $user = "你的数据库用户名"; $password = "你的数据库密码"; // 初始化PJBridge:连接到Java服务端的主机(vnode)和整数端口(比如1234) $db = new PJBridge("vnode", 1234); $result = $db->connect($connStr, $user, $password); if(!$result){ // 建议加上错误信息,方便定位问题 die("连接失败:" . $db->getError()); } return $db; // 注意:应该返回PJBridge对象,而非$result,具体以PJBridge文档为准 } ?> <?php class PJBridge { private $sock; private $jdbc_enc; private $app_enc; public $last_search_length = 0; function __construct($host="vnode", $port=1234, $jdbc_enc="ascii", $app_enc="ascii") { // 这里的port是Java服务端监听的整数端口,不是Ingres的服务别名 $this->sock = fsockopen($host, $port); if (!$this->sock) { die("无法连接PJBridge服务端:" . socket_strerror(socket_last_error())); } $this->jdbc_enc = $jdbc_enc; $this->app_enc = $app_enc; } // 记得补充getError()这类错误获取方法,方便排查问题 } ?>
4. 必要的环境准备
- 启动Java服务端:运行PJBridge的Java服务端程序时,要指定监听端口(比如
java -jar PJBridgeServer.jar -port 1234,具体命令看PJBridge的官方说明),并且把Ingres的JDBC驱动包(ingresjdbc.jar)加到Java服务端的classpath里,否则Java服务端无法连接Ingres。 - 防火墙检查:确保Windows 7和VMS服务器之间的Java服务端端口(比如1234)是开放的,没有防火墙拦截。
- Ingres权限配置:确认VMS上的Ingres服务允许远程连接,检查
ingresv的监听配置。
内容的提问来源于stack exchange,提问作者yolande
相关产品推荐
相关产品推荐

