Page 1 sur 1

Problème de connexion PHP vers base de données Oracle

Posté : 23 janv. 2013, 12:53
par Vincent L.
Bonjour,

J'ai un problème concernant le pool de connexions dans le cadre d'une connexion de PHP vers une base de données Oracle, via OCI8.
Je ne suis pas développeur, et je ne connais donc pas profondément PHP. Malgré mes recherches sur le web, je ne trouve pas d'informations claires me permettant de solutionner mon problème, d'où ce post.

Configuration :

Linux Redhat 6.2
Apache HTTP Server 2.4.3
PHP 5.4.7
Oracle RDBMS 11gR2

Description succincte du problème :

Le paramétrage OCI8, en particulier les clauses "oci8.persistent_timeout" et "persistent_timeout", ne semble pas fonctionner.

Jeu de test :

Je dispose de la page PHP suivante, nommée "test_cnx_DB_Oracle.php" :

<?php
  $DB_CONNECT_STRING = "monserveurdb.mondomaine.be:1521/moninstancedb";

  $DB_USER = "phptest";
  $DB_PASS = "xxxxxxx";

  $conn = oci_pconnect($DB_USER, $DB_PASS, $DB_CONNECT_STRING, 'AL32UTF8');

  if (!$conn) {
    echo "Echec connexion";
    var_dump(oci_error());
    exit();
  }

  $query = "alter session set nls_language='FRENCH'";
  $stmt = oci_parse($conn, $query);
  oci_execute($stmt, OCI_DEFAULT);
  oci_free_statement($stmt);

  $query = "select to_char(to_date(level || '/' || level || '/2012', 'DD/MM/YYYY'), 'DD MONTH YYYY') as date_txt from dual connect by level <= 12";
  $stmt = oci_parse($conn, $query);
  oci_execute($stmt, OCI_DEFAULT);

  echo '<ol>';
  while ($row = oci_fetch_assoc($stmt)) {
    echo '<li><pre>';
    var_dump($row);
    echo '</pre></li>';
  }
  echo '</ol>';

  oci_close($conn);

  ?>

Je dispose également d'une simple page "test.php" :

<?PHP
 phpinfo();
?>

Enfin, je vérifie l'état des connexions en base de données grâce au sql suivant :

select osuser, machine, program, process, status
from v$session v
where username = 'PHPTEST'

Enfin, voici les paramètres utilisés en OCI8 :

oci8.max_persistent = 3
oci8.persistent_timeout = 10


Problème :

Après démarrage d'Apache, la requête SQL ne retourne aucun enregistrement (normal).
J'invoque 5 fois la page "test_cnx_DB_Oracle.php" : la requête SQL retourne 5 enregistrements, ce qui pose un premier problème compte-tenu que tous ces enregistrements sont associés au même processus : le paramètre "oci8.max_persistent" n'a pas l'air d'être pris en compte.

Après avoir attendu plus de 10 secondes, j'invoque alors la page "test.php", car j'ai lu quelque part qu'il fallait que PHP soit invoqué d'une manière ou d'une autre pour provoquer la vérification des timeouts de connexion vers la DB. Malgré cet appel, la requête SQL retourne toujours 5 enregistrements : on dirait donc que le paramètre oci8.persistent_timeout n'est pas pris en compte non plus.

On dirait donc que la gestion du pool de connexions ne fonctionne pas, et que les paramètres oci8 ne sont pas pris en compte.

Pourriez-vous valider ma procédure de test, et si elle est pertinent, me suggérer des pistes pour solutionner ce problème ?

Merci !