繁体   English   中英

oci_connect 连接失败

[英]oci_connect connection failed

我在从本地 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_ADMINc:\\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调用都返回相同的错误。

我也试过ezconnect为11克方式说明这里- [//]host_name[:port][/service_name][:server_type][/instance_name]

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

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

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 (32bit) 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 client尽管它的路径设置在TNS_ADMINPATH环境变量中...

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

尽管这个问题可以被视为一个确切的重复这一个-它尚未回答,我想没有人会返回到那个老问题,即使我后我遇到的连接问题太多评论。 还要记住,在那个类似的问题中,返回并询问了不同的错误。

由于一些错误的配置和寻找解决方案的三天时间,我搬到Linux服务器上进行开发,所有问题都消失了。

我发现了什么:

  • php_oci8.dllphp_oci8_11g.dll都取决于Oracle Instant Client库
    • 这些库不包含oci_函数(例如oci_connect ),仅ociX函数(例如ociLogon ),这很奇怪。
  • 尽管我敢肯定我已经下载了Oracle Instant Client Basic和所有扩展,但是由于未知的字符集,我无法连接到另一台Oracle服务器,并且错误提示我仅在使用Lite Instant Client。
  • 我没有尝试过64位和32位即时客户端版本
  • 我的Apache是​​64位,Windows是64位,PHP是32位,远程Oracle服务器是64位,远程Linux服务器是64位...
  • 尝试了许多环境设置( ORA_HOMETNS_ADMIN ,调整后的PATH以查找即时客户端安装)无济于事
  • 由于可能的环境设置干扰而尝试卸载本地Oracle XE服务器无济于事
  • 差点迷失了我的头-无济于事...

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

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

要将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);

**

注意:i)。 确保启用了PHP_OCI8和PHP_OCI8_11g应用

ii)。 Oracle 11区分大小写。

最好的问候Yasir Hashmi

我遇到了同样的问题,并尝试从本地计算机连接到远程服务器。 经过2个星期的练习,我终于可以使用它了。

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

因此,让我们来看看提供的示例PHP:

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

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

如果将您的计算机设置为其他计算机,则需要指定该计算机。 请参阅下面的新示例:

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

尝试使用您指定的端口。

希望这可以帮助

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

祝好运。

我在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

为了记录(PHP 8.0.12),您还可以尝试:

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

📁 apache24
....📁 bin
....... 📃oraociei12.dll
....... 📃oci.dll
....... 📃oraons.dll

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM