IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

L'extension oci ne se lance pas avec php en ligne de commande ? [Oracle]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Points : 11
    Points
    11
    Par défaut L'extension oci ne se lance pas avec php en ligne de commande ?
    Bonjour à la communauté !

    Dans le cadre de la réalisation de mon application web, j'ai été amené à utiliser PHP 5 et Oracle 10g express.

    Je dois effectuer une routine d'import toutes les nuits, aussi ai-je créé un script php qui sera lancé par un .bat par windows (ou cron) à heure fixe tous les soirs.

    Lorsque je test ce script par l'intermediaire d'un navigateur (lorsque je le lance donc manuellement) tout fonctionne à merveille.

    Cependant lorsque je délegue ce travail à une tâche planifiée windows, j'ai quelques soucis.

    Ce script insere dans la base de donnée oracle des enregistrements (quelques milliers ). Comme je l'ai dit plutôt lorsque je charge via le navigateur, c'est certe un peu long mais tout fonctionne, lorsque c'est une tâche planifié qui s'en occupe, Le script retourne une erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Call to undefined function oci_connect() in C:\Program Files\EasyPHP 2.0b1\www\simucron\Sql.class.php on line 34
    J'en ai donc conclus que les extensions php ne se lance pas toutes seules lorsqu'on utilise php.exe en ligne de commande.

    Voici le script bat que j'utilise.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @"C:\Program Files\EasyPHP 2.0b1\php5\php.exe" "C:\Program Files\EasyPHP 2.0b1\www\simucron\script.php" > log.txt
    J'ai fait quelques recherche sur l'utilisation des .bat : l'arobase est censé maintenir la fenetre ouverte (soit dit en passant ça ne fonctionne pas elle se ferme quand même ...)

    A noter aussi que lorsque je rajoute le paramètre -q à php.exe (ceci est censé annuler l'envoi des headers, chose inutile en ligne de commande), le script ne fonctionne plus qu'il soit lancé manuellement ou pas.

    Je souhaiterais un coup de main, si l'un de vous a déjà été confronté à ce soucis. L'important n'est pas de gardé la fenetre ouverte ou de pouvoir executer sans les headers, c'est surtout les insertions SQL qui ne peuvent pas ce faire du fait du non lancement du module oci.

    Mes questions sont donc les suivantes :

    • Quelle est la source de l'erreur oci, l'extension ne se charge pas ? ou est-ce qu'elle n'a pas le temps de se charger.
    • Normalement lorsqu'on lance php.exe il prend compte du php.ini et charge toutes les extensions qui y sont décommenté non ?


    Merci pour votre aide

    Cordialement.

    PS : le fichier Sql.class.php est une classe que j'ai réaliser qui me permet de dialoguer avec la base de donnée, cette classe fonctionne parfaitement dans l'application elle n'est donc pas AMHA la source de ce problème, d'autant plus que je le rappel le lancement manuelle du script ne donne pas d'erreur, tous les enregistrements sont insérés.

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 194
    Points : 200
    Points
    200
    Par défaut
    bonjour,

    si tu m'est ton bat dans le même dossier que ton fichier script, et que tu le modifie de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @"..\..\..\php5\php.exe" script.php > log.txt
    Est ce que cela, te provoque la même erreur ?

    Yasen77

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Salut,

    Merci de ta réponse, il me semble que tu es remonté un cran de trop dans l'arborescence donc je me suis permis de modifier ton astuce en :

    @"..\..\php5\php.exe" script.php > log.txt

    Malheureusement, rien de bien meilleur, le script fonctionne comme tout à l'heure mais à partir du moment ou j'utilise la base de donnée j'ai la même erreur, il trouve pas la fonction oci_connect, comme si l'extension ne s'était pas chargé...

    A noter aussi que la fenetre se referme quadn même malgré le symbole @

    Et donc pour répondre à ta question oui, cela me provoque la même erreur

  4. #4
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 194
    Points : 200
    Points
    200
    Par défaut
    est-il possible de voir le code de ton script.php, si ce n'est pas indiscret, bien sur.

    Yasen77

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Voici le code de la page php script.php :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    <?php 
    set_time_limit(0);
    sleep(10);
    require_once('constants.php');
    require_once('fonctions.php');
    require_once('Sql.class.php');
    require_once('Log.class.php');
     
    $destinatairemail = "mail@mail.ext";
     
     
     
    $erreurs = "" ;
     
    $repertoireimage = "imgtmp";
    $fichiersite1 = "logs/site1_trace.htm";
    $fichiersite2 = "logs/site2_trace.htm";
     
    $datecourante = date("d/m/Y h:i",time());
     
    // Traitement site1 -----------------------------------------------------------------------------------------------------------------------------------------
     
     
    if(is_file($fichiersite1))
    {
    	$logsite1 = new Log($fichiersite1,";","<br>","site1");
     
    	// 2 -  on charge le fichier site1 dans la base  
    	$chargementok = $logsite1->chargerLog();
     
    	$statutlogsite1 = $logsite1->statut;
     
    		if($chargementok)
    		{
    			// on supprime le fichier site1
    			if(unlink($fichiersite1))
    			{
    				$statutlogsite1 .= "\n $datecourante - Le fichier $fichiersite1 a été supprimé avec succès ";
    			}
    			else
    			{
    				$statutlogsite1 .= "\n $datecourante - Le fichier $fichiersite1 n'a pas été supprimé";
    			}
    		}
    		else
    		{
    			// Traitement en cas d'echec
    		}
    }
    else
    {
    	$erreurs .= "$datecourante - Le fichier $fichiersite1 n'existe pas impossible de charger les stats \n";
    	$statutlogsite1 = "Le fichier site1 $fichiersite1 n'existe pas.";
    }
     
     
    // Traitement site2 ---------------------------------------------------------------------------------------------------------------
     
    if(is_file($fichiersite2))
    {
    	$logsite2 = new Log($fichiersite2,";","<br>","site2");
     
    	// 2 -  on charge le fichier site1 dans la base  
    	$chargementok = $logsite2->chargerLog();
     
    	$statutlogsite2 = $logsite2->statut;
     
    		if($chargementok)
    		{
    			// on supprime le fichier site1
    			if(unlink($fichiersite2))
    			{
    				$statutlogsite2 .= "\n $datecourante - Le fichier $fichiersite2 a été supprimé avec succès ";
    			}
    			else
    			{
    				$statutlogsite2 .= "\n $datecourante - Le fichier $fichiersite2 n'a pas été supprimé";
    			}
    		}
    		else
    		{
    			// Traitement en cas d'echec
    		}
    }
    else
    {
    	$erreurs .= "$datecourante - Le fichier $fichiersite2 n'existe pas impossible de charger les stats \n";
    	$statutlogsite2 = "Le fichier site2 $fichiersite2 n'existe pas.";
    }
     
     
    // Traitement image 
     
    $statutimgtmp = "";
     
    if(is_dir($repertoireimage))
    {
    	if(clearDir($repertoireimage))
    	{
    		if(mkdir($repertoireimage))
    		{
    			$statutimgtmp = "Le repertoire $repertoireimage a été correctement recréé";
    		}
    		else
    		{
    			$statutimgtmp = "Le repertoire $repertoireimage a été correctement effacé mais n'a pas pu être recréé. L'application le  fera lors du chargement de la prochaine stats avec graphe";
    		}
    	}
    }
    else
    {
    	$statutimgtmp = "Le repertoire $repertoireimage n'a pas pu être trouvé pour être effacé, il sera créé par l'application lors du chargement de la prochaine stats avec graphe";
    }
     
     
    if(strlen($erreurs) == 0){$erreurs = "Aucune erreur.";}
     
    $email = "\n Rapport des importation des stats au $datecourante \n ";
    $email .= "\n \n Statut de l'import site1 : \n ".$statutlogsite1." ";
    $email .= "\n \n Statut de l'import site2 : \n ".$statutlogsite2." ";
    $email .= "\n \n Erreurs éventuelles : \n $erreurs";
    $email .= "\n \n Rapport sur le dossier cache des graphiques : \n $statutimgtmp ";
     
     
     
         $headers ='From: mail@mail.ext'."\n"; 
     
     
    // Enfin on envoi le mail de monitoring
     
     
    ini_set("SMTP","smtp.domaine.prv"); 
     
    if(mail($destinatairemail,"Rapport STATS LOG au $datecourante",$email,$headers))
    {
    	echo "mail envoyé";
    }
    ?>
    Notez que la classe Log permet une lecture d'un fichier csv et la méthode chargerLog l'insertion dans la base de donnée des ligne grace à un objet Sql.class

    Je ne pense pas que le script pose problème, j'ai essayé de faire un sleep pour voir si ça venait du fait que l'extension n'a pas le temps de se chargé ça n'a rien donné...

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 194
    Points : 200
    Points
    200
    Par défaut
    Et le code du Sql.class?
    surtout la fonction qui donne l'erreur.

    Yasen77

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Voici la classe Sql.class.php

    L'erreur se produit je pense lors de l'appel de oci_connect ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    <?php
    /**
    \brief Gestion du SGBD 
    
    Classe SQL : Cette classe permet la connexion entre l'application et le SGBD
    Elle sera utilisée par les différentes méthodes de la couche métier.
    */
     
    class Sql{
     
    	protected $user;
    	protected $pass;
    	protected $server;
    	protected $connexionEnCours;
    	protected $nbligneaf = 0; // ** Retourne le nombre de ligne affecté par la dernière requête */
    	protected $statut = 'Déconnecté';
     
    	function __construct()
    	{
    		$this->user = '';
    		$this->pass = '';
    		$this->server = '';
    	}
     
     
     
     
    	public function connect()
    	{
    		$this->user = __USER__;
    		$this->pass = __PASS__;
    		$this->server = __SERVER__;
     
    		$this->connexionEnCours = oci_connect($this->user,$this->pass,$this->server);
    		if($this->connexionEnCours) $this->statut = 'Connecté!';
    	}
     
    	public function close()
    	{
    		//On se déconnecte du serveur
    		ocilogoff($this->connexionEnCours);
    		$this->statut = 'Déconnecté';
    	}
     
     
     
    	/**
    	\param string req requête sql à executer
    	\param bool indique si on doit retourner un objet via oci_fetch_object ou non, retour vaut true si oui false si non.
    	*/
    	public function select($req,$objet = null)
    	{
     
            //On parse la requête à effectuer sans oublier de lui passer la chaine de connexion en paramêtre
    		$statement = ociparse($this->connexionEnCours,$req);
     
    		ociexecute($statement);
     
    		 $tab = array();
    		if($objet)
    		{
    			while($ligne = oci_fetch_object($statement,OCI_BOTH))
    			{
    				$tab[] = $ligne;
    			}
    		}
    		else
    		{
    			while($ligne = oci_fetch_array($statement,OCI_BOTH))
    			{
    				$tab[] = $ligne;
    			}
    		}
     
    		return $tab;
     
    	}
     
     
    	public function query($req)
    	{
    		//On parse la requête à effectuer sans oublier de lui passer la chaine de connexion en paramêtre
     
     
    		if(!$statement = ociparse($this->connexionEnCours,$req)) 
    		{
    			oci_rollback($this->connexionEnCours);
    			 $this->statut = 'Erreur lors de l\'appel d\'ociparse la requête est incorrecte';
    			return false;
    		}
     
     
     
     
    		if(!ociexecute($statement,OCI_DEFAULT)) 
    		{
    			//Il y a eu un problème avec la transaction.
    			 oci_rollback($this->connexionEnCours);
    			 $this->statut = 'Erreur lors de la dernière transaction avec la base de donnée. Aucune modification n\'a été importé';
    			return false;
    		}
     
    		//Si nous parvenons jusqu'à là, tout s'est bien déroulé.
    		oci_commit($this->connexionEnCours);
    		$this->statut = 'Transaction réussie';
    		$this->nbligneaf = oci_num_rows($statement);
    		return true;
    	}
     
    	function __get($nom)
    	{
    		return $this->$nom;
    	}
     
    	function __set($nom,$valeur)
    	{
    		$this->$nom = $valeur;
    	}
    }
    ?>
    Les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $this->user = __USER__;
    		$this->pass = __PASS__;
    		$this->server = __SERVER__;
    permettent la configuration de la connexion _USER , _ PASS_ , _SERVER_ sont des variables globales déclarées dans constants.php

  8. #8
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 194
    Points : 200
    Points
    200
    Par défaut
    J'ai vu sur un site, que l'on pouvais utilisé ocilogon au lieu de oci_connect.
    Est ce que tu as déjà essayé cette solution ?

    Yasen77

  9. #9
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    ocilogon est utilisé pour les versions antérieur à PHP4 , depuis pour garder une compatibilité il ont créé un alias en PHP5 qu'ils ont appelé ociconnect, cela revient donc à la même chose à l'exception près que l'on préconise l'utilisation d'ociconnect maintenant plutôt qu'ocilogon...

    Donc ça ne m'aidera pas forcement malheureusement , merci de l'idée tout de même !

  10. #10
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    J'ai résolu mon problème,

    Pour ceux qui sont confronté au même soucis voici la source du problème :
    le fichier php.ini n'etait pas présent dans le dossier php contenant le php.exe

    Le fait que ça marchait via le navigateur peut être expliqué de la sorte : c'est apache qui charger pour php les informations du php.ini, d'ailleurs le fichier php.ini etait présent dans le repertoire d'apache. Php n'avait donc aucun moyen de savoir quelles extensions chargé en standalone.

    Merci de votre aide

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Ayant eu le même problème, j'en suis arrivé à créer un .bat :
    <repertoire du php.exe>\php.exe -c <repertoire Apache du php.ini>\php.ini <repertoire du script>\test.php.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 22/02/2013, 10h47
  2. [Prototype] Alert ne se lance pas
    Par beegees dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 16/08/2009, 10h00
  3. Réponses: 0
    Dernier message: 27/02/2009, 15h41
  4. [Mail] Problème étrange avec PHP en ligne de commande
    Par jojosbiz dans le forum Langage
    Réponses: 3
    Dernier message: 21/05/2007, 14h04
  5. Tâche qui ne se lance pas avec cron
    Par bugalood dans le forum Administration système
    Réponses: 3
    Dernier message: 17/10/2005, 18h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo