You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:31:03