web-dev-qa-db-ja.com

未定義の関数oci_connect、php_oci8_12c.dll、windows 8.1、php5.6.6の呼び出し

私は単純なphpスクリプトを持っています:

<?php
$db_user = 'myusername';
$db_pass = 'mypassword';
$db_sid = 'mysid';
$conn = oci_connect( $db_user, $db_pass, $db_sid );
?>

(ブラウザーまたはコマンドラインから)実行すると、エラーが発生します。

Call to undefined function oci_connect

私はphp_oci8_12c.dllがすでに付いているphp 5.6.6を使用しています。

私のphp.iniにextension=php_oci8_12c.dllがあります

インスタントクライアント(12.1)をインストールしました-32ビットバージョンと64ビットバージョンを試しました

インスタントクライアントフォルダ(C:\ instantclient_12_1)を指すOracle_HOMEおよびTNS_ADMIN環境変数があります。

私のパスにもC:\ instantclient_12_1があります

同じフォルダにtnsnames.oraがあり、この関連エントリが含まれています。

MYSID =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(Host = myhost.net)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = MYSERVICE)
    )
  )

http://www.Oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html からSQLDeveloperもダウンロードしました

SQLDeveloperは動作し、上記のtnsnames.oraを認識して接続し、phpスクリプトがアクセスしようとしているのと同じデータベースで正常にクエリを実行します。

私は何日もかけて数時間を費やして、役に立たないようにさまざまなことを試しました。

私が使用しています:

php 5.6.6
windows 8.1
IIS (so no answers involving Apache please)
cmd (run as administrator)
Oracle Database 11g Enterprise Edition 11.2.0.3.0 

役立つと思われるその他の情報:

私はoci 1.4.10を使用して本番サーバーと一致させることが理想的ですが、今のところそれほど心配していません。

pear install oci8-1.4.10.tgz

私にこのエラーを与えます:

The DSP oci8.dsp does not exist

そのエラーについて、私にとって何か意味のある説明は見つかりません。

何が欠けている-誰かが私を助けてくれますか

編集:

私はstackoverflowに関する他の投稿でさまざまな提案を試しました、すなわち:

extension=oci8.soあり、なしextension=php_oci8_12c.dll

Php.iniファイルにextension=php_Oracle.dllという行がありません

編集:

phpinfoは、正しいphp.iniファイルを使用していることを教えてくれます。

Loaded Configuration File => C:\php5.6.6\php.ini

Phpinfoの次の行も役立つかもしれません。

Configure Command => cscript /nologo configure.js  "--enable-snapshot-build" "--enable-debug-pack" "--disable-zts" "--disable-isapi" "--disable-nsapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=c:\php-sdk\Oracle\x86\instantclient_12_1\sdk,shared" "--with-oci8-12c=c:\php-sdk\Oracle\x86\instantclient_12_1\sdk,shared" "--with-enchant=shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet=shared" "--with-mcrypt=static" "--without-analyzer" "--with-pgo"

編集:

DspファイルはVC++プロジェクトファイルのようです-私は今、php拡張機能の作成方法を学ぶことに挑戦しています。うまくいけば、oci8 1.4.10ソースコードをdllにコンパイルするための十分な知識があることを願っています。 Windows 8で動作します-誰かがこの質問への答えで私を救出しない限り-これは私に時間がかかるようです:-)

編集:

Php.iniにdisplay_startup_errors = Onを追加すると、oci dllが有効なWin32アプリケーションではないことがわかります

8
Graham

編集: うーん。 Windows 8でこれを試行すると、指定したのと同じエラーが生成されるようです。現在調査中です...

私の間違い(間違ったextension_dir行を有効にしていた)。以下に説明するように、Win8で動作します。


次の手順は、PHPでOCIを動作させるために必要なすべてです(新しくインストールしたWindows 2008 R2 Standard x64仮想マシンでこれを確認しました):

  • PHPをダウンロードして解凍します(C:\phpphp-5.6.7-nts-Win32-VC11-x86.Zipを使用しました)。).
  • InstantClientをダウンロードして解凍します(C:\instantclient_12_1instantclient-basic-nt-12.1.0.2.0.Zipを使用しました)。
  • 上記のパスをシステムパスに追加します。
  • c:\php\php.ini-productionc:\php\php.iniにコピーします。
  • php.ini
    • extension_dir = "ext"を有効にしました。
    • extension=php_oci8_12c.dllを有効にしました。
  • Microsoft Visual C++ 2010 Runtime(x86)をインストールします。これはOCI8拡張に必要です。
  • Microsoft Visual C++ 2012 Runtime(x86)をインストールします。これはPHPに必要です。

この時点で、コマンドプロンプトでphp --ri oci8を実行すると、次の出力が表示されます。

C:\>php --ri oci8

oci8

OCI8 Support => enabled
OCI8 DTrace Support => disabled
OCI8 Version => 2.0.9
Revision => $Id: f5a3ee1083d1ffa6adb5143efda6eafa210b8414 $
Oracle Run-time Client Library Version => 12.1.0.2.0
Oracle Compile-time Instant Client Version => 12.1

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

Statistics =>
Active Persistent Connections => 0
Active Connections => 0

そしてoci_connect関数をチェックします:

C:\>php -r "var_dump(function_exists('oci_connect'));"
bool(true)
11
timclutton

問題を解決するために言われたことに加えて、一部の人々はOCI対応アプリケーションをCLIモードで実行する必要があるため、php CLIの側面を追加したいと思います。私の場合、oci8が正しく読み込まれたことを示すために、oci.dllのインスタンスをwamp/bin/php/php<version>/php --ri oci8フォルダにコピーする必要がありました。これは、本格的なアプリケーションを正しく実行するために他のファイルが必要でなかったことを証明するものではありません(私の技術脚注を参照)。 instantclient 12ディストリビューションへのパスを含めることはできません。

テクニカルノート:私の環境はWindows 7 + WAMP3(php 5.6.15、Apache 2.4.17)であり、いくつかの実験を行った結果、3つの最小セットを絞り込むことができましたZend Framework内でOracleアダプターをインスタンス化し、SQLクエリを実行してレコードセットを読み取るために、instantclient 12ディストリビューションからbinディレクトリ(非CLIアプリの場合はApacheの)にコピーする必要があるファイル

このセットは、oci.dlloraociei12.dllorans.dllです。

特に、oci.dllだけをコピーしても、アプリケーションは機能しません(不明な例外が発生します)。

2
Fabien Haddadi