2015-03-25 5 views
5

Ich habe einen einfachen PHP-Skript:Call to undefined function oci_connect, php_oci8_12c.dll, Fenster 8.1, php5.6.6

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

Wenn ich es laufe (von einem Browser oder von der Kommandozeile), erhalte ich der Fehler:

Call to undefined function oci_connect 

ich bin mit pHP 5.6.6, die bereits dort mit php_oci8_12c.dll kam.

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

ich Instant-Client installiert haben (12.1) - versucht, 32-Bit-Version und 64-Bit-Version

Ich habe ORACLE_HOME und TNS_ADMIN Umgebungsvariablen zu dem Zeitpunkt Client-Ordner zeigen (C: \ instantclient_12_1).

Ich habe auch C: \ instantclient_12_1 in meinem Weg

Ich habe einen tnsnames.ora im selben Ordner mit diesem entsprechenden Eintrag in es:

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

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

SQLDeveloper funktioniert, erkennt die oben genannten tnsnames.ora und verbindet und führt erfolgreich eine Abfrage auf der gleichen Datenbank, die mein PHP-Skript versucht zuzugreifen.

Ich habe mehrere Stunden mehrere Tage damit verbracht, verschiedene Dinge ohne Erfolg auszuprobieren.

Ich verwende:

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 nützlich sein könnte:

würde ich am liebsten OCI 1.4.10 verwenden, um den Produktionsserver passen, aber nicht allzu besorgt über die zur Zeit.

pear install oci8-1.4.10.tgz 

gibt mir diese Fehlermeldung:

The DSP oci8.dsp does not exist 

ich keine Erklärung zu diesem Fehler finden kann, die mir etwas bedeutet.

Was ich vermisst - kann mir jemand helfen

EDIT:

Ich habe die verschiedenen Vorschläge in anderen Beiträgen auf Stackoverflow versucht, nämlich:

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

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

EDIT:

phpinfo sagt mir, dass ich das richtige PHP verwende.ini-Datei:

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

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

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" 

EDIT:

Es scheint, dass dsp Dateien VC++ Projektdateien - ich bin jetzt wagen zu lernen, wie man um eine PHP-Erweiterung zu erstellen, und hoffentlich wenn ich das gemacht habe, werde ich genug Wissen haben, um den OCI8 1.4.10 Quellcode in eine DLL zu kompilieren, die auf Windows 8 funktioniert - es sei denn, jemand rettet mich mit der Antwort auf diese Frage Sieht so aus, als würde es einige Zeit dauern :-)

EDIT:

Hinzufügen display_startup_errors = On zu php.ini mir sagt, dass die OCI dll

keine gültige Win32-Anwendung ist
+1

Überprüfen Sie bitte dem Link: - http://stackoverflow.com/questions/22478387/call-to-undefined- Funktion-Oci-Verbindung. (zweite Antwort) Oder http://stackoverflow.com/questions/8635881/fatal-error-call-to-undefined-function-oci-connect. (erste Antwort) –

+0

Versuchte diese bereits – Graham

+1

Überprüfen Sie, ob Sie eine Kopie von 'msvcr71.dll' irgendwo in Ihrem Pfad haben. – timclutton

Antwort

10

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

Mein Fehler (ich hatte die falsche extension_dir Linie aktiviert). Es funktioniert in Win8 genau wie unten dokumentiert.


Die folgenden Schritte sollten alles, was Sie brauchen, um OCI mit PHP bekommen arbeiten (Ich habe dies nur überprüft auf einem frisch installierten Windows 2008 R2 Standard x64 virtuelle Maschine):

  • Herunterladen und Extrakt PHP (ich benutzte C:\php von php-5.6.7-nts-Win32-VC11-x86.zip).
  • Laden Sie den InstantClient herunter und extrahieren Sie ihn (ich benutzte C:\instantclient_12_1 von instantclient-basic-nt-12.1.0.2.0.zip).
  • Fügen Sie die obigen Pfade zum Systempfad hinzu.
  • Kopieren c:\php\php.ini-production zu c:\php\php.ini.
  • in php.ini:
    • Linie extension_dir = "ext" aktiviert.
    • aktivierte Leitung extension=php_oci8_12c.dll.
  • Installieren Sie Microsoft Visual C++ 2010 Runtime (X 86). Dies wird für die OCI8-Erweiterung benötigt.
  • Installieren Sie Microsoft Visual C++ 2012-Laufzeit (x 86). Dies wird für PHP benötigt.

An diesem Punkt php --ri oci8 in einer Eingabeaufforderung ausgeführt wird, zeigt mir die folgende Ausgabe:

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 Kontrolle für die oci_connect Funktion:

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

Da Sie sich die Mühe gemacht haben, mein Problem zu reproduzieren, ist das Mindeste, was ich tun kann, eine saubere Installation zu versuchen und zu sehen, was passiert - umbenannt Meine PHP und Instant-Client-Ordner - Registry-Eintrag umbenannt - heruntergeladen die Dateien wieder - deinstalliert die VC++ Laufzeiten - folgte Ihren Anweisungen - ich war wirklich hoffnungsvoll - zumindest dieses Mal bekomme ich eine andere Fehlermeldung, wenn ich 'php --ri oci8 'laufen - oci.dll fehlt. Kopierte oci.dll vom umbenannten Ordner in c: \ php - jetzt zurück zu Platz eins - ein weiterer Punkt - Ich musste die Zeile 'extension = php_oci8_12c.dll' hinzufügen, anstatt sie zu aktivieren - danke für den Versuch – Graham

+0

Woher hast du deine? VC++ Laufzeiten von - das ist die einzige Sache, die vielleicht anders sein könnte? – Graham

+1

Ich bin verwirrt, warum Sie 'oci.dll' in den PHP-Ordner kopieren müssen. Solange die Pfade richtig eingestellt sind, sollte es "einfach funktionieren". 'oci.dll' hängt von den anderen Dateien im Ordner 'instantclient' ab, so dass das Kopieren in den PHP-Ordner nicht funktioniert. – timclutton

2

Zusätzlich zu dem, was gesagt wurde, zu beheben Das Problem, ich möchte die php CLI Seite der Dinge hinzufügen, da einige Leute OCI-fähige Anwendungen im CLI-Modus ausführen müssen.In meinem Fall musste ich eine Instanz oci.dll in den Ordner wamp/bin/php/php<version>/ für php --ri oci8 kopieren, um zu zeigen, 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). Das Hinzufügen des Pfads zur Instantclient 12-Verteilung würde es nicht tun.

Technische Hinweise: Meine Umgebung zu sein: Windows 7 + WAMP3 (PHP 5.6.15, Apache 2.4.17), ich war nach einer Reihe von Experimenten, in der Lage, die minimale Anzahl von drei Dateien zu verengen, die erforderlich in das bin-Verzeichnis kopiert werden (Apache für nicht-cli-apps) aus der instantclient-12-Distribution, um einen Oracle-Adapter innerhalb von Zend Framework zu instanziieren, eine SQL-Abfrage durchzuführen und das Recordset zu lesen.

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

Insbesondere das Kopieren nur oci.dll würde die Anwendung nicht zulassen (unknow Ausnahme ausgelöst) arbeiten

+1

Könnte die dritte Datei 'oraons.dll' sein? –

+2

Absolut! Mein Fehler. Es ist "oraons.dll". Entschuldigung für die Verspätung, ich habe heute nur deinen Kommentar bemerkt. –

Verwandte Themen