oci_connect连接失败

时间:2013-02-01 12:10:30

标签: php oracle zend-server-ce

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

我已经按照here - ezconnect [//]host_name[:port][/service_name][:server_type][/instance_name]的{​​{1}}方式尝试了oci_connect("user", "password", "X.X.X.X:1521/MYDB", "AL32UTF8", 0); 方式:

service name

但问题是我不知道service ID,只知道SIDoci_connect(): ORA-12514: TNS:listener does not currently know of service requested in connect descriptor ),因此返回的错误是:

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

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

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

OCI8的PHP信息:

unknown

可能问题是Oracle instant clientTNS_ADMIN虽然它的路径是在PATH和{{1}}环境变量中设置的......

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

虽然这个问题可以被认为是一个完全重复的of this one - 它还没有得到回答,我想即使我发表评论我也没有回到那个老问题我也有连接问题。 另请注意,在该类似问题中,会返回并询问不同的错误。

5 个答案:

答案 0 :(得分:4)

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

我发现了什么:

  • php_oci8.dllphp_oci8_11g.dll都取决于Oracle Instant Client库
    • 这些库不包含oci_个函数(如oci_connect),只有ociX个函数(如ociLogon),这很奇怪......
  • 虽然我很确定我已经下载了Oracle Instant Client 基本以及所有扩展程序,但由于未知的字符集,我无法连接到另一台Oracle服务器,错误是说我正在使用只有精简版即时客户端...
  • 我无法使用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并继续前进!

答案 1 :(得分:2)

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

步骤1: 使用sys as sysdba登录到db并执行以下脚本。

**

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用法

ⅱ)。 Oracle 11区分大小写。

最诚挚的问候 Yasir Hashmi

答案 2 :(得分:1)

我遇到了同样的问题,并尝试从本地计算机连接到远程服务器。 经过两周的努力,我终于开始工作了。

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

所以让我们拿PHP提供的示例:

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

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

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

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

尝试使用指定的端口。

希望这有帮助

答案 3 :(得分:1)

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

祝你好运。

答案 4 :(得分: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