1

我在从本地 Zend 服务器 CE 连接到外部 ORA DB 11g 时遇到严重问题。OCI8 已启用并运行版本 1.4.6(由于phpinfo())。

我尝试了许多连接选项(如下所列),但返回了相同的错误:

oci_connect(): ORA-28547: connection to server failed, probable Oracle Net admin error

在谷歌搜索了一整天后,我只能说这个错误意味着 PHP 能够与服务器通信,但无法连接到具体的服务/数据库,并且错误不应该来自 PHP 本身......

我已将环境变量设置TNS_ADMIN为包含此连接描述c:\oracle_instantclient_11_2的文件所在的位置:tnsnames.ora

MYDB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = X.X.X.X)(PORT = 1521))
    )
    (CONNECT_DATA = (SID = MYDB)(SERVER = DEDICATED))
  )

使用此描述

(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=X.X.X.X)(PORT=1521)))(CONNECT_DATA=(SID=MYDB)(SERVER=DEDICATED)))

我能够使用sqlplus控制台连接到服务器和服务/数据库,所以连接非常正确。我也使用相同的 HOST、PORT 和 SID 来使用Sqldeveloper工具连接到服务器。问题是在 PHP 中连接到服务器时...

到目前为止我尝试了什么:

oci_connect("user", "password", "X.X.X.X:1521", "AL32UTF8", 0);
oci_connect("user", "password", "MYDB", "AL32UTF8", 0);
oci_connect("user", "password", "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=X.X.X.X)(PORT=1521)))(CONNECT_DATA=(SID=MYDB)(SERVER=DEDICATED)))", "AL32UTF8", 0);

上面所有这些oci_connect调用都返回提到的相同错误。

我也尝试过ezconnect11g 的方式,如此所述- [//]host_name[:port][/service_name][:server_type][/instance_name]

oci_connect("user", "password", "X.X.X.X:1521/MYDB", "AL32UTF8", 0);

但问题是我不知道service name,只有service IDSID),因此返回的错误是这样的:

oci_connect(): ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

这表示没有使用提供的服务名称运行的服务(或者 ORA 侦听器不知道此类服务)。

PHP 版本:5.3.14
Appache v.:2.2.22(32 位)Zend
Zend 服务器 CE:5.3.6

OCI8 的 PHP 信息:

OCI8 Support                   enabled
Version                        1.4.6
Revision                       $Revision: 313688 $
Active Persistent Connections  0
Active Connections             0
Oracle Instant Client Version  Unknown
Temporary Lob support          enabled
Collections support            enabled

Directive                     Local Value   Master Value
oci8.connection_class         no value      no value
oci8.default_prefetch         100           100
oci8.events                   Off           Off
oci8.max_persistent           -1            -1
oci8.old_oci_close_semantics  Off           Off
oci8.persistent_timeout       -1            -1
oci8.ping_interval            60            60
oci8.privileged_connect       Off           Off
oci8.statement_cache_size     20            20

也许问题是虽然它的路径在环境变量和环境变量中都设置了unknown版本...Oracle instant clientTNS_ADMINPATH

我的问题是:有人知道我做错了什么吗?我错过了什么吗?我昨天用谷歌搜索了一整天,所以可能(有 99% 的机会)任何谷歌链接你想提供给我我已经看过并尝试过......

虽然这个问题可以被认为是这个问题的完全重复-它还没有得到回答,我想即使我发表评论,也没有人会回到那个旧问题,我也有连接问题。还要记住,在类似的问题中,会返回并询问不同的错误。

4

6 回答 6

4

由于几个错误配置和在寻找解决方案时失去了 3 天的时间,我转而在 Linux 服务器上进行开发,所有问题都消失了。

我发现了什么:

  • 两者php_oci8.dllphp_oci8_11g.dll依赖于 Oracle Instant Client 库
    • 这些库不包含oci_函数(like oci_connect),只有奇怪的ociX函数(like )......ociLogon
  • 虽然我很确定我已经下载了 Oracle Instant Client Basic和所有扩展,但由于未知字符集,我无法连接到另一台 Oracle 服务器,并且错误说我只使用Lite即时客户端...
  • 我尝试了 64 位和 32 位即时客户端版本均无济于事
  • 我的 Apache 是 64 位,windows 是 64 位,PHP 是 32 位,远程 Oracle 服务器是 64 位,远程 Linux 服务器是 64 位...
  • 尝试了许多环境设置(ORA_HOME, TNS_ADMIN,调整PATH为即时客户端安装)无济于事
  • 由于可能的环境设置干扰,尝试卸载本地 Oracle XE 服务器无济于事
  • 几乎失去了我的头 - 无济于事......

所以最后在 Linux 服务器上,我连接到远程 Oracle 服务器没有问题。某处(在浏览数以千计的 PHP-Oracle 相关页面时)我发现了一条信息“不应开发连接到 Windows 下的 Oracle 服务器的 PHP 应用程序”,而应坚持使用 UNIX 系统...

因此,任何遇到类似或相同问题的人 - 如此友善,不要浪费您的时间,安装 VirtualBox,在其上运行 Linux 并继续前进!

于 2013-02-26T14:49:47.590 回答
3

要将 php 连接到 Oracle 11g 版本 11.2,您需要执行以下操作;

第 1 步:使用 sys 作为 sysdba 登录到您的数据库并执行以下脚本。

**

execute dbms_connection_pool.start_pool();
execute dbms_connection_pool.restore_defaults();

**

第 2 步:在您的 PHP 脚本中

**

$conn = oci_connect("username", "password", "//hostname/servicename");
if (!$conn) {
   $m = oci_error();
   echo $m['message'], "\n";
   exit;
}
else {
   print "Connected to Oracle!";
}
// Close the Oracle connection
oci_close($conn);

**

注:一)。确保启用 PHP_OCI8 和 PHP_OCI8_11g 功能

ii)。Oracle 11 区分大小写。

最好的问候亚西尔哈什米

于 2013-05-04T07:58:33.370 回答
1

我遇到了同样的问题,并尝试从本地计算机连接到远程服务器。经过 2 周的调试,我终于让它工作了。

该解决方案非常简单,但未在 PHP 文档中记录

因此,让我们以提供的示例 PHP 为例:

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

他们没有提到的是它指向服务器上的默认端口。

如果您的设置为不同的,则需要指定。请参阅下面的新示例:

$conn = oci_connect('hr', 'welcome', 'localhost:1234/XE');

尝试使用您指定的端口。

希望这可以帮助

于 2013-10-02T12:40:56.900 回答
1

只需加上我的两分钱,因为我用这个把头撞在墙上......如果一切都失败了,试试这个,一旦你下载了即时客户端,http://www.oracle.com/technetwork/topics/ winsoft-085727.html,将提取的内容复制到 apache/bin 文件夹。它可能会要求您覆盖 oci.dll。这样做,然后重新启动 apache/php。幸运的是,这将解决问题...

祝你好运。

于 2015-07-20T18:50:50.907 回答
0

我在 Fedora 17 上的解决方案:

1. yum install httpd httpd-devel.
2. yum install php php-mysql php-pear php-devel
3. Install oracle instantclient:

rpm -Uvh oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm 
rpm -Uvh oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm 

4. pecl install oci8

This gives:

**
downloading oci8-1.4.7.tgz ...
Starting to download oci8-1.4.7.tgz (Unknown size)
.....done: 168,584 bytes
10 source files, building
running: phpize
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525
Please provide the path to the ORACLE_HOME directory.
Use 'instantclient,/path/to/instant/client/lib' if you're compiling
with Oracle Instant Client [autodetect] :' 
** 

Just press enter.

5. Enable the OCI8 extension by creating a file, oci8.ini for example, with the following line at /etc/php.d/:

extension=oci8.so

6. service httpd restart
于 2013-04-11T21:29:01.353 回答
0

作为记录(PHP 8.0.12),您也可以尝试:

在 Apache bin 文件夹中,复制到下一个文件中

apache24
.... bin
....... oraociei12.dll
....... oci.dll
.. oraons.dll

您可以在 Instant 客户端文件夹和 bin 文件夹中找到这些文件。

然后重新启动Apache,就是这样。

即时客户端、apache 版本和 PHP 版本必须是 32 位或 64 位。

您也可以尝试使用 ez-connection 进行连接(如果您想避免使用 tnsnames)。

于 2021-11-07T21:00:45.167 回答