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

Langage PHP Discussion :

PHP 5 se perd dans des require_once en cascade


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut PHP 5 se perd dans des require_once en cascade
    Salut,

    Je suis en PHP 5 sur un serveur Debian

    J'ai 3 fichiers PHP et dans chaque j'ai mis en première ligne
    error_log("debut fichier" . __FILE__);
    et en dernière ligne
    error_log("fin fichier" . __FILE__);

    Le fichier 1 fait un require_once du fichier 2
    Le fichier 2 fait un require_once du fichier 3
    Et le fichier 3 fait plein d'autres require_once (mais c'est pas le problème)

    Dans ma log, j'ai :
    Debut fichier 1
    Debut fichier 2
    Debut fichier 3
    Fin fichier 3
    Fin fichier 2

    ... et c'est tout.

    Pas d'autres traces (J'ai un error_reporting à E_ALL | E_STRICT )

    Dernier point : le 1er fichier est appelé en Ajax.

    Quelqu'un à une idée ?

  2. #2
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Je ne vois pas où est le problème.
    C'est peut être toi qui te perd avec ces require_once.

    require_once, comme son nom l'indique, va inclure qu'une seule fois le fichier, quand bien même qu'on tenterait de le faire plusieurs fois.
    Par ailleurs, le code Php sera exécuté séquentiellement, donc ligne par ligne.

    Don quand tu inclus en 1er le fichier 1, il est normal de voir en 1er :
    -> Debut fichier 1

    Puis comme à la suite du code de ce fichier 1 on inclus le fichier 2, ce code sera exécuté avant la dernière ligne (du fichier 1).
    Donc il est normal de voir à la suite :
    -> Debut fichier 2

    Puis comme dans ce fichier 2 on inclus encore un autre fichier 3, on verra :
    -> Debut fichier 3

    Comme tout cela est séquentiel, ce sera une fois que tout le fichier 3 sera exécuté que la suite du fichier 2 sera exécuté, il est normal de voir à la suite :
    -> Fin fichier 3

    Puis lorsque l'exécution du fichier 2 va reprendre (quand celui du fichier 3 sera terminé) on verra alors :
    Fin fichier 2


    Maintenant, il est vrai qu'il manque : Fin fichier 1
    Le code a peut être été interrompu.
    Ceci peu avoir lieu lors d'une erreur fatale, car pour ce type d'erreur le code est stoppé net.
    Peut être aussi as tu mis un point d'arrêt (volontaire ou involontaire), comme un exit() (ou son alias die).


    Tu peux utiliser cette même technique pour tenter de voir à quelle ligne le traitement serait stoppé (dans le fichier 1).
    Ceci soit en partant du début ou de la fin et déplacer de ligne en ligne pour se dire la chose suivante :
    A la ligne 20 le message est enregistré.
    A la ligne 22 le message n'est plus enregistré.
    Donc c'est la ligne 21 qui cause problème.
    (pure exemple bien sûr).


    Au passage, tu dis que le niveau des erreurs E_ALL | E_STRICT
    Donc ne vois tu pas de message d'erreur dans le fichier de log qui serait lié à cet éventuel problème ?
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci.

    Effectivement je n'ai pas été clair dans ma question :

    Dans fichier 1 j'ai un error_log juste après le require_once "fichier 2"
    ... qui n'est jamais exécuté (le error_log, pas le require).

    A la fin de "fichier 2" j'ai un error_log qui lui est bien affiché.

    Je n'ai donc aucune instruction entre le dernier error_log affiché et la suite.
    ... et aucune trace dans la log.

    D'ou mon incompréhension ...

  4. #4
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Dans fichier 1 j'ai un error_log juste après le require_once "fichier 2"
    ... qui n'est jamais exécuté (le error_log, pas le require).
    Ca parait impossible, donc incompréhensible, effectivement.

    Mais comme toute chose, entre ce qui est fait théoriquement et la réalité il y a bien souvent des différences.

    Donc à un moment il faut mettre du code, ce fichier 1 au moins car (théoriquement toujours) c'est lui qui causerait problème.


    Si tu supprimes le require_once du fichier 2 (indirectement le fichier 3 aussi), en espérant que cela ne soit pas indispensable, est-ce que tous les traitements dans le fichier 1 se font jusqu'à la fin ?
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Mon fichier 1 (upload.php de son vrai nom)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php			
    error_log('upload - 1 - Fichier : ' . __FILE__ . ' a la ligne ' . __LINE__ );
    require_once("../includes/php/config.php");
    error_log('upload - 2 - Fichier : ' . __FILE__ . ' a la ligne ' . __LINE__ );
    // etc ....
    Mon fichier 2 (config.php, bien sur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php			
    error_log('config - 1 - Fichier : ' . __FILE__ . ' a la ligne ' . __LINE__ );
     
    // plein de define comme 
    define(ARGOS_PATH, '/var/www/dev.domaine.tld/www/intranet/');
     
    // puis, en bas :
    require_once(ARGOS_PATH . "includes/php/include.php");
    error_log('config - 2 - Fichier : ' . __FILE__ . ' a la ligne ' . __LINE__ );
    ?>
    Coté log :
    [Sat May 05 10:18:12 2012] [error] [client 82.236.151.38] upload - 1 - Fichier : /var/www/dev.domaine.tld/www/intranet/documents/upload.php a la ligne 2
    [Sat May 05 10:18:12 2012] [error] [client 82.236.151.38] config - 1 - Fichier : /var/www/dev.domaine.tld/www/intranet/includes/php/config.php a la ligne 2
    [Sat May 05 10:18:13 2012] [error] [client 82.236.151.38] config - 2 - Fichier : /var/www/dev.domaine.tld/www/intranet/includes/php/config.php a la ligne 71, referer: http://dev.domaine.tld/intranet/util...eur.php?code=1

    ... et c'est tout !
    pas de "retour" à upload.php.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    en utilisant une forme simplifiée :
    test1.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php // test1.php
    echo('test1 - début : ' . __FILE__ . ' a la ligne ' . __LINE__ ).'<br />';
    echo 'ok test1<br />';
    require_once("test2.php");
    echo('test1 - fin : ' . __FILE__ . ' a la ligne ' . __LINE__ ).'<br />';
    ?>
    test2.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php // test2.php
    echo('test2 - début : ' . __FILE__ . ' a la ligne ' . __LINE__ ).'<br />';
    echo 'ok test2<br />';
    // puis, en bas :
    require_once("test3.php");
    echo('test2 - fin : ' . __FILE__ . ' a la ligne ' . __LINE__ ).'<br />';
    ?>
    test3.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php // test3.php
    echo('test3 - début : ' . __FILE__ . ' a la ligne ' . __LINE__ ).'<br />';
    echo 'ok test3<br />';
    echo('test3 - fin : ' . __FILE__ . ' a la ligne ' . __LINE__ ).'<br />';
    ?>
    On obtient bien :
    test1 - début : D:\WAMPserver\www\test\test1.php a la ligne 2
    ok test1
    test2 - début : D:\WAMPserver\www\test\test2.php a la ligne 2
    ok test2
    test3 - début : D:\WAMPserver\www\test\test3.php a la ligne 2
    ok test3
    test3 - fin : D:\WAMPserver\www\test\test3.php a la ligne 4
    test2 - fin : D:\WAMPserver\www\test\test2.php a la ligne 6
    test1 - fin : D:\WAMPserver\www\test\test1.php a la ligne 5
    DONC :
    - Le problème, à priori, ne vient PAS de l'imbrication des require_once.
    - Probablement une "fin de fichier" (exit; ou die; ?) quelque part dans un des fichiers.

  7. #7
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Alors là, franchement je ne vois pas d'explications, ça parait impossible.
    Vu que cela est effectué via Ajax, ça rend le débogage plus compliqué.

    As tu parcouru le fichier log de Php ? (php_error.log normalement)
    S'il y a des erreurs (ce qui devrait être le cas) il devrait avoir quelque chose.

    En mettant un point d'arrêt juste après le 2ème error_log du fichier 1 ?
    (en supprimant tout le code qui suit, sait on jamais)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php			
    error_log('upload - 1 - Fichier : ' . __FILE__ . ' a la ligne ' . __LINE__ );
    require_once("../includes/php/config.php");
    error_log('upload - 2 - Fichier : ' . __FILE__ . ' a la ligne ' . __LINE__ );
    exit();
    //code supprimé ci-dessous
    ?>
    Est-ce que le 2ème error_log() est enregistré ?


    Personnellement je repartirais de 0, c'est à dire de mettre comme seul code dans ce fichier 2 error_log(), en 1ère ligne et en dernière ligne.
    Les 2 doivent s'enregistrer.

    Puis après réintégrer le code petit à petit pour espérer détecter ce qui n'allait pas.


    As tu essayé de remplacer les require_once par include_once ?
    require_once provoque une erreur fatale, donc le script sera stoppé, alors que include_once provoque un Warning, le script continu quand même.
    En cas d'erreur bien sûr.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  8. #8
    Membre éprouvé Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2010
    Messages : 573
    Points : 915
    Points
    915
    Par défaut
    Vu que cela est effectué via Ajax, ça rend le débogage plus compliqué.
    et en appelant la page directement via la barre d'adresse du navigateur ?!
    Développeur informatique contrarié...

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    DONC :
    - Le problème, à priori, ne vient PAS de l'imbrication des require_once.
    On est d'accord. mais je ne sait pas d'ou il vient ?!

    Citation Envoyé par jreaux62 Voir le message
    - Probablement une "fin de fichier" (exit; ou die; ?) quelque part dans un des fichiers.
    Non, comme tu le vois il n'y a aucune instruction entre la fin de include.php (fichier 2) et la trace du fichier appelant.

    Citation Envoyé par RunCodePhp Voir le message
    As tu parcouru le fichier log de Php ? (php_error.log normalement)
    S'il y a des erreurs (ce qui devrait être le cas) il devrait avoir quelque chose.
    Je suis sur un serveur Débian, la log, c'est le fichier que j'ai copié-collé.

    Citation Envoyé par RunCodePhp Voir le message
    Alors là, franchement je ne vois pas d'explications, ça parait impossible.
    Vu que cela est effectué via Ajax, ça rend le débogage plus compliqué.
    Tu as raison, la seule piste que j'ai c'est 2eme un appel du même fichier (merci Ajax !) qui foutrait la drouille. Mais comment contrôler ça ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Re.
    Le mieux est de réaliser un débogage par dichotomie (comme le propose aussi RunCodePhp) :
    -> tu commentes (// ...) des pans entiers du code et/ou des require.
    -> jusqu'à voir apparaitre (enfin !) ta fin de fichier.
    -> ensuite, du remets les morceaux les uns après les autres, jusqu'à trouver celui qui "coince".
    Citation Envoyé par Arrobe Voir le message
    ... qui foutrait la drouille.
    C'est quoi, la drouille ?
    Un mélange de trouille et de drisse ?

  11. #11
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Je suis sur un serveur Débian, la log, c'est le fichier que j'ai copié-collé.
    La plus grosse tuile (le truc le plus embêtant) est là.
    Depuis le temps que je fait du Php j'ai jamais entendu parlé que Php stoppait net en silence, sans un retour d'erreur.

    Pour ma part on n'aurait pas la certitude d'avoir tous les retours d'erreur de Php.
    Essai d'ailleurs de provoquer quelques erreur, d'une simple erreur jusqu'à une erreur fatale au début de ce fichier 1 pour voir si elles sont réellement enregistrées.

    Pour ma part avant de tenter de savoir où serait l'erreur, ce serait d'être certain que le error_reporting soit bien au max, soit E_ALL | E_STRICT, mais aussi que l'affichage des erreur soit activée (display_error).
    Pour le chemin du error_log() théoriquement c'est bon.
    As tu bien défini cela dans le fichier 1 ?

    Le 2ème point aussi qui me semble important, c'est de prévoir que le code JS/AJAX affiche les erreurs éventuelles ( un alert() ), quitte à modifier le code JS pour ça.

    En somme de faire de simples echo dans le fichier appelé par Ajax.
    Ca n'empêche pas de conserver les error_log().


    Bref ... faut être certain d'avoir tous les messages d'erreurs, des notices jusqu'aux fatales.
    Sinon c'est faire les choses au pif.


    Grosso modo de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php			
    error_log('upload - 1 - Fichier : ' . __FILE__ . ' a la ligne ' . __LINE__ );
    echo 'upload - 1 - Fichier : ' . __FILE__ . ' a la ligne ' . __LINE__."\n";
     
    require_once("../includes/php/config.php");
     
    error_log('upload - 2 - Fichier : ' . __FILE__ . ' a la ligne ' . __LINE__ );
    echo 'upload - 1 - Fichier : ' . __FILE__ . ' a la ligne ' . __LINE__."\n";
     
    // ... etc ...
    ?>
    Et de voir le le résultat dans une boite alert() JS.


    Je sèche, disons le clairement.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

Discussions similaires

  1. Réponses: 7
    Dernier message: 21/12/2007, 12h56
  2. Récupérer des données javascript dans des variables php
    Par TigerWolf dans le forum Général JavaScript
    Réponses: 21
    Dernier message: 25/06/2007, 10h03
  3. Réponses: 1
    Dernier message: 31/01/2007, 11h59
  4. Bouton Droit dans des pages PHP
    Par kagura dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 04/07/2006, 11h45
  5. récupérer les erreurs php dans des exceptions
    Par jeanvincent dans le forum Langage
    Réponses: 6
    Dernier message: 14/10/2005, 16h26

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