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
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):
C:\php
à partir de php-5.6.7-nts-Win32-VC11-x86.Zip
).C:\instantclient_12_1
à partir de instantclient-basic-nt-12.1.0.2.0.Zip
).c:\php\php.ini-production
dans c:\php\php.ini
.php.ini
: extension_dir = "ext"
.extension=php_oci8_12c.dll
.À 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)
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)