1

ローカルZendサーバーCEから外部ORADB11gに接続する際に深刻な問題が発生しています。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_2tnsnames.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述べたように11gの方法を試しました- :[//]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.dllOracleInstantClientライブラリに依存しています
    • oci_これらのライブラリには関数(のような)は含まれていません。奇妙な関数(のような)oci_connectのみが含まれています。ociXociLogon
  • Oracle Instant Client Basicとすべての拡張機能をダウンロードしたことは確かですが、文字セットが不明なために別のOracleサーバーに接続できず、Liteインスタントクライアントのみを使用しているというエラーが表示されました...
  • 64ビットと32ビットの両方のインスタントクライアントバージョンを無駄に試しました
  • 私のApacheは64ビット、Windowsは64ビット、PHPは32ビット、リモートOracleサーバーは64ビット、リモートLinuxサーバーは64ビットです...
  • 多くの環境設定(、、クライアントの即時インストールを参照するように調整)を試しORA_HOMEましたが、役に立ちませんでしTNS_ADMINPATH
  • 環境設定の干渉の可能性があるため、ローカルのOracleXEサーバーをアンインストールしようとしました。
  • ほとんど頭を失った-無駄に...

最後に、Linuxサーバーでは、リモートのOracleサーバーに接続するのに問題はありません。どこかで(何千ものPHP-Oracle関連のページを閲覧しているときに)「WindowsでOracleサーバーに接続するPHPアプリケーションを開発するべきではなく」、代わりにUNIXシステムに固執するべきであるという情報を見つけました...

したがって、同様または同じ問題が発生している人は誰でも、親切にして時間を無駄にしないでください。VirtualBoxをインストールし、Linuxを実行して、先に進んでください。

于 2013-02-26T14:49:47.590 に答える
3

phpをOracle11gバージョン11.2に接続するには、次の手順を実行する必要があります。

ステップ-1:sysを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の機能が有効になっていることを確認してください

ii)。Oracle11では大文字と小文字が区別されます。

よろしくYasirHashmi

于 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

これで壁に頭をぶつけたので、2セントを追加するだけです...他のすべてが失敗した場合は、これを試してください。インスタントクライアントをダウンロードしたら、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

これらのファイルは、Instantclientフォルダーとbinフォルダーにあります。

次に、Apacheを再起動します。

インスタントクライアント、Apacheバージョン、およびPHPバージョンは、32ビットまたは64ビットである必要があります。

ez-connectionを使用して接続を試みることもできます(tnsnamesの使用を避けたい場合)。

于 2021-11-07T21:00:45.167 に答える