web-dev-qa-db-fra.com

Appel à la fonction non définie oci_connect, php_oci8_12c.dll, Windows 8.1, php5.6.6

J'ai un script php simple:

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

Lorsque je l'exécute (à partir d'un navigateur ou de la ligne de commande), j'obtiens le message d'erreur suivant:

Call to undefined function oci_connect

J'utilise php 5.6.6 qui est déjà venu avec php_oci8_12c.dll.

J'ai extension=php_oci8_12c.dll dans mon php.ini

J'ai installé le client instantané (12.1) - essayé la version 32 bits ET la version 64 bits

J'ai des variables d'environnement Oracle_HOME et TNS_ADMIN pointant vers le dossier client instantané (C:\instantclient_12_1).

J'ai aussi C:\instantclient_12_1 dans mon chemin

J'ai un tnsnames.ora dans ce même dossier avec cette entrée pertinente:

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

J'ai également téléchargé SQLDeveloper à partir de http://www.Oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html

SQLDeveloper fonctionne, reconnaît le fichier tnsnames.ora mentionné ci-dessus, se connecte et exécute avec succès une requête sur la même base de données à laquelle mon script php tente d'accéder.

J'ai passé plusieurs heures sur plusieurs jours à essayer différentes choses en vain.

J'utilise:

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 

Quelques autres informations qui pourraient s'avérer utiles:

J'aimerais idéalement utiliser oci 1.4.10 pour correspondre au serveur de production, mais ne vous inquiétez pas trop pour le moment.

pear install oci8-1.4.10.tgz

me donne cette erreur:

The DSP oci8.dsp does not exist

Je ne trouve aucune explication à cette erreur qui veuille dire rien pour moi.

Qu'est-ce qui me manque? Quelqu'un peut-il m'aider?

MODIFIER:

J'ai essayé les différentes suggestions dans d'autres articles sur stackoverflow, à savoir:

extension=oci8.so avec et sans extension=php_oci8_12c.dll

Je n'ai pas la ligne extension=php_Oracle.dll dans mon fichier php.ini

MODIFIER:

phpinfo me dit que j'utilise le fichier php.ini correct:

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

Cette ligne de phpinfo pourrait aussi être utile:

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"

MODIFIER:

Il semble que les fichiers dsp soient des fichiers de projet VC++ - je me lance maintenant dans l’apprentissage de la création d’une extension php, et j’espère que cela me permettra d’avoir suffisamment de connaissances pour compiler le code source de oci8 1.4.10 dans une dll qui fonctionne sur Windows 8 - à moins que quelqu'un me sauve avec la réponse à cette question - on dirait que ça va me prendre du temps :-)

MODIFIER:

Ajouter display_startup_errors = On à php.ini m'indique que la dll oci n'est pas une application Win32 valide

5
Graham

Modifier:  Hmm. Essayer cela sous Windows 8 semble générer la même erreur que celle spécifiée. Je suis en train d'enquêter ...

Mon erreur (j'avais activé la mauvaise ligne extension_dir). Cela fonctionne dans Win8 juste comme documenté ci-dessous.


Les étapes suivantes devraient suffire à faire fonctionner OCI avec PHP (je viens de vérifier cette information sur une machine virtuelle x64 Windows 2008 R2 Standard récemment installée):

  • Téléchargez et extrayez PHP (j'ai utilisé C:\php à partir de php-5.6.7-nts-Win32-VC11-x86.Zip).
  • Téléchargez et extrayez InstantClient (j'ai utilisé C:\instantclient_12_1 à partir de instantclient-basic-nt-12.1.0.2.0.Zip).
  • Ajoutez les chemins ci-dessus au chemin système.
  • Copiez c:\php\php.ini-production dans c:\php\php.ini.
  • dans php.ini:
    • ligne activée extension_dir = "ext".
    • ligne activée extension=php_oci8_12c.dll.
  • Installez Microsoft Visual C++ 2010 Runtime (x86). Ceci est nécessaire pour l'extension OCI8.
  • Installez Microsoft Visual C++ 2012 Runtime (x86). Ceci est nécessaire pour PHP.

À ce stade, l'exécution de php --ri oci8 dans une invite de commande me montre le résultat suivant:

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

Et en vérifiant la fonction oci_connect:

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

En plus de ce qui a été dit pour résoudre le problème, j'aimerais ajouter le côté php CLI, car certaines personnes ont besoin d'exécuter des applications compatibles OCI en mode CLI. Dans mon cas, j'ai dû copier une instance de oci.dll dans le dossier wamp/bin/php/php<version>/ pour php --ri oci8 afin de montrer que oci8 était correctement chargé. Cela ne prouve pas que d'autres fichiers n'étaient pas nécessaires pour exécuter correctement une application complète (voir ma note de bas de page technique). L'inclusion du chemin d'accès à la distribution instantclient 12 ne le ferait pas.

Notes techniques: Mon environnement étant: Windows 7 + WAMP3 (PHP 5.6.15, Apache 2.4.17), j’ai pu, après un certain nombre d’expériences, affiner le jeu minimal de trois fichiers qui devait être copié dans le répertoire bin (Apache pour les applications autres que cli) à partir de la distribution instantclient 12, pour permettre l'instanciation d'un adaptateur Oracle dans Zend Framework, effectuer une requête SQL et lire le jeu d'enregistrements.

Cet ensemble est: oci.dll, oraociei12.dll et orans.dll.

En particulier, copier simplement oci.dll ne permettrait pas à l'application de fonctionner (une exception inconnue est survenue)

2
Fabien Haddadi