wake-up-neo.net

Aufruf der undefinierten Funktion oci_connect, php_oci8_12c.dll, Windows 8.1, php5.6.6

Ich habe ein einfaches PHP-Skript:

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

Wenn ich es (von einem Browser oder von der Kommandozeile) aus laufe, erhalte ich die Fehlermeldung:

Call to undefined function oci_connect

Ich verwende php 5.6.6, das bereits mit php_oci8_12c.dll geliefert wurde.

Ich habe extension=php_oci8_12c.dll in meiner php.ini

Ich habe Instant Client (12.1) installiert - 32-Bit-Version UND 64-Bit-Version

Ich habe Oracle_HOME- und TNS_ADMIN-Umgebungsvariablen, die auf den Instant-Client-Ordner zeigen (C:\instantclient_12_1).

Ich habe auch C:\instantclient_12_1 in meinem Pfad

Ich habe eine tnsnames.ora in demselben Ordner mit diesem relevanten Eintrag:

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

Ich habe SQLDeveloper auch von http://www.Oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html heruntergeladen.

SQLDeveloper funktioniert, erkennt die oben genannten tnsnames.ora und stellt eine Verbindung her und führt erfolgreich eine Abfrage in derselben Datenbank aus, auf die mein PHP-Skript zugreift.

Ich habe mehrere Stunden an mehreren Tagen damit verbracht, verschiedene Dinge ohne Erfolg zu probieren.

Ich benutze:

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 

Einige andere Informationen, die sich als nützlich erweisen könnten:

Idealerweise würde ich gerne oci 1.4.10 verwenden, um auf den Produktionsserver zu passen, aber das macht mir im Moment keine Sorgen.

pear install oci8-1.4.10.tgz

gibt mir diesen Fehler:

The DSP oci8.dsp does not exist

Ich kann keine Erklärung für diesen Fehler finden, der mir etwas bedeutet.

Was fehlt mir? Kann mir jemand helfen?

BEARBEITEN:

Ich habe die verschiedenen Vorschläge in anderen Beiträgen zu stackoverflow ausprobiert, nämlich:

extension=oci8.so mit und ohne extension=php_oci8_12c.dll

Ich habe nicht die Zeile extension=php_Oracle.dll in meiner php.ini-Datei

BEARBEITEN:

phpinfo sagt mir, dass ich die richtige php.ini-Datei verwende:

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

Diese Zeile von phpinfo könnte auch von Nutzen sein:

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"

BEARBEITEN:

Es scheint, dass dsp-Dateien VC++ - Projektdateien sind - ich wage jetzt, wie man eine PHP-Erweiterung erstellt, und wenn ich das getan habe, habe ich genug Wissen, um den Quellcode von oci8 1.4.10 in eine DLL zu kompilieren funktioniert unter Windows 8 - es sei denn, jemand rettet mich mit der Antwort auf diese Frage - es sieht so aus, als würde es mich etwas dauern :-)

BEARBEITEN:

Durch Hinzufügen von display_startup_errors = On zu php.ini wird mir mitgeteilt, dass die oci-DLL keine gültige Win32-Anwendung ist

5
Graham

Editieren:  Hmm. Wenn Sie dies unter Windows 8 versuchen, wird anscheinend derselbe Fehler generiert, den Sie angegeben haben. Ich untersuche gerade ...

Mein Fehler (ich hatte die falsche extension_dir-Zeile aktiviert). Es funktioniert in Win8 genauso wie unten beschrieben.


Die folgenden Schritte sollten ausreichen, um OCI mit PHP zum Laufen zu bringen (ich habe dies gerade auf einer frisch installierten virtuellen Maschine mit Windows 2008 R2 Standard x64 überprüft):

  • Laden Sie PHP herunter und extrahieren Sie es (ich habe C:\php von php-5.6.7-nts-Win32-VC11-x86.Zip verwendet).
  • Laden Sie InstantClient herunter und extrahieren Sie es (ich habe C:\instantclient_12_1 von instantclient-basic-nt-12.1.0.2.0.Zip verwendet).
  • Fügen Sie die oben genannten Pfade zum Systempfad hinzu.
  • Kopieren Sie c:\php\php.ini-production in c:\php\php.ini.
  • in php.ini:
    • aktivierte Zeile extension_dir = "ext".
    • aktivierte Zeile extension=php_oci8_12c.dll.
  • Installieren Sie Microsoft Visual C++ 2010 Runtime (x86). Dies ist für die OCI8-Erweiterung erforderlich.
  • Installieren Sie Microsoft Visual C++ 2012 Runtime (x86). Dies wird für PHP benötigt.

Wenn an diesem Punkt php --ri oci8 in einer Eingabeaufforderung ausgeführt wird, wird mir die folgende Ausgabe angezeigt:

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

Und für die oci_connect-Funktion suchen:

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

Zusätzlich zu dem, was gesagt wurde, um das Problem zu beheben, möchte ich die Seite php CLI hinzufügen, da einige Benutzer OCI-fähige Anwendungen im CLI-Modus ausführen müssen. In meinem Fall musste ich eine Instanz von oci.dll in den Ordner wamp/bin/php/php<version>/ kopieren, damit php --ri oci8 angezeigt wird, dass oci8 korrekt geladen wurde. Das beweist nicht, dass andere Dateien nicht benötigt wurden, um eine vollwertige Anwendung korrekt auszuführen (siehe meine technische Fußnote). Die Angabe des Pfads zur InstantClient 12-Distribution würde dies nicht tun.

Technische Anmerkungen: In meiner Umgebung: Windows 7 + WAMP3 (php 5.6.15, Apache 2.4.17), konnte ich nach einigen Versuchen den minimalen Satz von drei Dateien einschränken Dies musste von der instantclient 12-Distribution in das bin-Verzeichnis (Apaches für Nicht-Cli-Apps) kopiert werden, um einen Oracle-Adapter in Zend Framework zu instantiieren, eine SQL-Abfrage auszuführen und das Recordset zu lesen.

Dieser Satz ist: oci.dll, oraociei12.dll und orans.dll.

Insbesondere das Kopieren von nur oci.dll würde die Anwendung nicht funktionieren lassen (Unbekannte Ausnahme ausgelöst)

2
Fabien Haddadi