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

Shell et commandes GNU Discussion :

Tâche cron qui refuse MySQLi


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Points : 1
    Points
    1
    Par défaut Tâche cron qui refuse MySQLi
    Bonjour,

    J'ai eu la semaine dernière sur un site l'affichage de messages d'alerte annonçant que les fonctions mysql sont obsolètes (suite à un passage à PHP 5.5 décidé par l'hébergeur MochaHost) et qu'il faudra passer bientôt à MySQLi, ce que j'ai fait sans problème.
    Ensuite, une tâche cron lancée quotidiennement et qui utilise le même script php que le site pour accéder à la base de données a généré le message d'erreur : Fatal error: undefined function mysqli_connect()
    J'ai cru alors comprendre que les tâches cron ne tournent pas nécessairement dans le même environnement que le site et que la version de PHP utilisée pour le cron peut être différente, ce qui expliquerait qu'il ne connaisse pas les fonctions MySQLi si la version de PHP est antérieure à la 5.0 (sinon comment expliquer le "undefined function" ?).

    D'où ces questions :
    • Est-ce que ce que j'ai cru comprendre est correct, à savoir est-il possible que cron fonctionne avec une version de PHP plus ancienne que celle du site ?
    • Si oui, comment pourrais-je connaître la version de PHP du cron, pour faire comprendre aux techniciens du support que le problème vient de là : ils ont fait une mise à jour de la version PHP du site en oubliant celle du cron, qui lance un script php situé sur le site.

    J'espère que mes explications sont claires.

    Le système du site :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Linux vps.hiram91.net 2.6.32-042stab113.11 #1 SMP Fri Dec 18 17:32:04 MSK 2015 x86_64
    PHP 5.5.4
    Merci aux bonnes volontés,
    Stéphane

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    Bonjour,

    comment pourrais-je connaître la version de PHP du cron
    fait exécuter une commande du genre /<chemin>/php --version par cron, ou une page comportant la commande idoine pour afficher la version de php.
    mais, a priori, cron lance les scripts en suivant les indications données dans le shebang.

    quelle est la ligne de commande dans crontab ?

    et, je ne m'habitue pas à ce qu'on utilise PHP: Hypertext Preprocessor avec cron.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Merci pour cette réponse de spécialiste.
    Malheureusement, c'est suite à un appel au secours que je tente de traiter ce problème mais je ne suis qu'un développeur web qui n'a jamais effectué une tâche cron et qui ne connaît pas grand chose à la mécanique des serveurs (même si je développe depuis plus de 15 ans).
    Donc je ne sais pas comment exécuter cette commande et je ne sais pas non plus ce qu'est ce shebang.

    Je viens d'accéder à l'admin du site et en éditant la tâche cron, j'ai vu la ligne suivante :
    /usr/bin/php -q /home/ledifice/public_html/cron/cron.php
    C'est peut-être ça ce que tu appelles la ligne de commande dans crontab ?

    Donc ce script quotidien vient exécuter cron.php, qui a en include un fichier php de connexion à la base de données dans lequel j'ai, il y a 2 jours, remplacé les fonctions mysql obsolètes par leur équivalent mysqli. Et le cron envoie un mail en disant qu'il ne connaît pas de mysqli.

    J'ai essayé d'expliquer tout ceci au technicien (sans être sûr que mon explication soit juste mais je ne vois pas d'autre raison à ce refus de mysqli par cron alors que ça tourne bien sur le site) qui répond comme souvent par des généralités qui laissent penser qu'il a lu l'explication en diagonale.
    Et si possible, je voudrais dire au technicien : le site tourne sous PHP 5.5.4 depuis votre dernier update de la semaine dernière mais les tâches cron sont sous PHP 4.?.? qui ne connaît pas les fonctions mysqli. Merci, M. le technicien, de faire un update de ce qui gère le cron et qui semble dater un peu.

    Tant pis si je ne trouve pas la version de PHP du cron, mais pourrais-tu me dire si mon raisonnement est cohérent ou si le cron ne fonctionne pas ainsi (et dans ce cas pourquoi le fichier php me dit que les fonctions mysqli ne sont pas définies).

    Je sais, c'est tordu, mais c'est tout de même un problème embêtant.

    Merci
    Stéphane

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    la commande montre que le fichier php est exécuté avec /usr/bin/php.
    c'est cet exécutable que tu dois interroger (/usr/bin/php --version (ou quelque chose de semblable (cf. man php))), pour en connaître la version.

    pourrais-tu me dire si mon raisonnement est cohérent ou si le cron ne fonctionne pas ainsi (et dans ce cas pourquoi le fichier php me dit que les fonctions mysqli ne sont pas définies)
    il y a plus à parier que tu t'es trompé quelque part en remplaçant mysql par mysqli.

    la ligne de commande s'exécute-t-elle correctement dans la console ?

    mettre php en mode bavard (cf. man php) devrait donner des indications sur ce qui se passe lors de l'exécution du script...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Pour qu'une fonction php soit reconnue, il faut qu'elle ait la bonne signature (bon nom, bon nombre de paramètres, bons types de variable en paramètre).
    La technique mysqli n'est pas exactement la même que mysql.
    (Moi aussi, j'ai eu à faire la transformation dont tu parles)
    Il ne suffit pas de rajouter un "i" à la fin...



    N_BaH a donc raison de demander si cela marche en console. Ce n'est pas la peine de demander l'automatisation, si le script ne marche pas une fois en manuel.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Merci N_BaH et Flodelarab,

    Je sais qu'il est souvent difficile de bien formuler par écrit ; donc je reformule : mes fonctions mysqli fonctionnent correctement (je n'ai pas simplement ajouté un "i"), elles sont concentrées dans un fichier clsdatalayer.php appelé sur le site et font bien leur boulot.
    Ensuite, le cron utilise ce même fichier clsdatalayer.php avec les instructions mysqli merveilleusement définies et c'est là qu'apparaît le message d'erreur :
    • qui ne dit pas "syntax error" ou équivalent comme ce serait le cas si les paramètres de mysqli_connect() étaient en nombre insuffisant ou non déclarés, etc. (je rappelle que cette même fonction fait bien le boulot dans les pages du site),
    • mais qui dit "undefined function" : c'est tout autre chose, cela signifie que la fonction n'existe pas pour PHP quand le script est lancé par cron uniquement.

    C'est pour cette raison que je souhaitais savoir si les scripts cron dépendent d'un autre moteur PHP que le site lui-même, ce qui semble être le cas pour les raisons exposées dans les 2 points ci-dessus, mais aussi parce que les répertoires /usr/bin/php --version (N_BaH m'a aiguillé là-dessus) n'apparaissent pas dans le FTP (ils sont sans doute en amont ou ailleurs).

    Mais bon, si c'est trop pointu, ne vous tracassez pas, je peux redévelopper des scripts en "vieux" mysql juste pour le cron. Et quand l'hébergeur se décidera à mettre cron à jour, nous aurons à nouveau des messages nous invitant à utiliser des fonctions mysqli.
    Il s'agit juste pour moi d'aider un papy qui s'est trouvé bien décontenancé en découvrant un matin que suite à un update de PHP même pas annoncé par l'hébergeur MochaHost, son vieux site truffé de fonctions obsolètes s'est mis à afficher des tas de messages d'alerte "e_deprecated". J'ai d'abord désactivé l'affichage de ces messages, mais c'était une rustine à court terme. Je vais donc créer des pages indépendantes juste pour ce maudit cron.

    Merci à vous et bonne journée,
    Stéphane

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    N'abandonne pas si vite.

    • Pour connaître l'emplacement du logiciel php utilisé, tape la commande suivante:
      Ce n'est pas grave que ce ne soit pas le même que N_BaH.
    • La version du php est possiblement indiquée dans le(s) .htaccess à la racine du site (ou un des dossiers du site).
      Vérifie que la version indiquée à cette endroit n'est pas obsolète.
    • Pour un client chez OVH, il y a eu un fichier texte à insérer sur le site pour indiquer la version de php utilisé. Vérifie si ce n'est pas le cas pour ton ami aussi.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Merci encore pour la réponse (la mienne arrive tard, j'ai tellement de taf...).
    Donc en réponse à Flodelarab : si je comprends bien, je dois taper la commande "which php" pour connaître la version de PHP utilisée par le cron (la version du site est 5.5.20 d'après phpinfo, donc elle accepte les instructions mysqli sans souci alors que le cron trouve à redire : undefined function, ceci en appelant l'un et l'autre le même fichier PHP - c'est pour rappeler les faits après une semaine). Mais je ne vois pas où taper ce "which php". J'ai accès au backoffice du site qui propose des tas de choses (Logs, security, preferences, etc.) mais je ne vois rien qui permettent de saisir des lignes de commande (je ne connais pas grand chose à l'administration d'un serveur).

    Une idée, suggérée par N_BaH dans son premier message : si je lance un fichier php en tâche cron avec l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'Version PHP courante : ' . phpversion();
    je devrais a priori recevoir par mail la version de PHP qui pilote le cron, même si le fichier php est stocké dans le répertoire www du serveur...? Ou bien c'est la version du site qui s'affichera ? Je vais faire le test et j'apporte la réponse (quand le propriétaire du site sera rentré de vacances...), au cas où ça pourrait servir à quelqu'un.
    Merci
    Stéphane

  9. #9
    Membre habitué Avatar de silfun1
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2015
    Messages : 117
    Points : 187
    Points
    187
    Par défaut
    Bonjour Scriptolab, bonjour à tous,

    Une erreur du type "undefined function mysqli_connect()" peut aussi venir de ton fichier php.ini. En effet, on peut avoir qu'un seul moteur PHP, mais plusieurs php.ini (1 par utilisateur par exemple). Donc des comportements différents alors qu'il n'y a qu'un seul binaire php.
    A cela s'ajoute, le fait qu'on utilise pas forcément la même configuration selon que le PHP soit lancé par le serveur web ou si on le lance manuellement dans un terminal... je sais, c'est pas simple....
    Je parles du php.ini car c'est dans ce fichier qu'on active/désactive les extensions. Il se peut simplement que ton extension mysqli ne soit pas active.
    Bref, quand tu lances ta commande cron, il faut que tu sois certain du binaire et du php.ini que tu utilise. A mon avis, pour cela, il faut utiliser des chemins absolus et pas seulement le nom du binaire.
    ex: /usr/bin/php -c /etc/php5/php.ini -q -f /var/www/html/ma_super_page.php

    Pour te fournir toutes ces infos, je t'ai fait un petit script qui test tout cela:

    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
    #!/bin/bash
     
    # Variables
    PHPBIN=$(which php)
    PHPINI=$($PHPBIN -i|grep 'php.ini'|grep -i 'loaded'|cut -d'>' -f2)
    PHPEXTDIR=$($PHPBIN -c $PHPINI -i |grep extension_dir|head -n1|cut -d'>' -f2|sed "s/=//g")
     
    PAGECONTENT1="<?php echo \"TEST PAGE<br>\"; ?>"
    PAGECONTENT2="<?php echo \"TEST PAGE<br>\";phpinfo();echo \"<br>\" ?>"
     
    PHPWEBPAGE="testmyphp.php"
     
    # Creation de ma page de test
     
    # page simple
    echo $PAGECONTENT1 > $PHPWEBPAGE
    # page contenant une fonction phpinfo
    #echo $PAGECONTENT2 > $PHPWEBPAGE
     
    #Affichage des infos sur ton binaire php
    echo "== Infos PHP =="
    echo "Binaire php = "$PHPBIN
    echo "Fichier de conf. php.ini = "$PHPINI
    echo "Presence de configuration mysqli = "
    echo "------"
    $PHPBIN -c $PHPINI -i|grep mysqli
    echo " "
     
    # On liste le dossier contenant les extensions du moteur PHP
    # On verifie que le dossier existe bien
    if [ -d $PHPEXTDIR ]; then
            echo "Liste des extensions du dossier $PHPEXTDIR  (extension_dir)"
            ls -l $PHPEXTDIR
    else
            echo "Le dossier $PHPEXTDIR n'existe pas"
    fi
    echo " "
     
    # lancement du traitement de ma page php
    echo " -- Test d'une page PHP --  ($PHPBIN -c $PHPINI -q -f $PHPWEBPAGE)"
    $PHPBIN -c $PHPINI -f $PHPWEBPAGE
     
    echo ""


    L'informatique, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
    - Ne vous privez pas pour voter pour ma réponse si elle vous plaît bien
    - Ne pas hésiter à cliquer sur "Résolu" quand votre problème posé a trouvé une solution. Et un petit merci fait toujours plaisir

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Merci de se donner tout ce mal pour ce problème, silfun1.
    Par contre, je ne sais pas comment utiliser le code qui tu as bien sympathiquement donné : la partie "Cron jobs" de l'espace d'administration du site me permet juste d'insérer la périodicité et une simple ligne de commande du style /usr/bin/php -q /home/le_site/public_html/cron/cron.php
    J'imagine qu'il faut faire pointer cette ligne de commande vers un fichier contenant ton script, mais comme il ne s'agit apparemment pas de php (à part quelques passages), quelle extension dois-je lui donner ? Ou alors il faut en faire un autre usage, mais je ne vois pas quoi étant donné mes maigres connaissances en gestion de serveur.

    Merci
    Stéphane

  11. #11
    Membre habitué Avatar de silfun1
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2015
    Messages : 117
    Points : 187
    Points
    187
    Par défaut
    Arf, effectivement, si tu n'as pas un terminal, c'est un peu plus compliqué. Mais pas impossible.
    Il suffit de traduire mon script shell bash en php (voir le code en dessous).
    Tu envoies ce fichier php sur ton serevur web et tu l'appelle sur ton navigateur web. Par contre, pense à retirer ce fichier une fois que tu as les infos. C'est pas très "secure".

    Voila le code 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
    <?php
     
    echo "<br><h1>Version de ton PHP</h1><br>";
    echo phpversion();
    echo "<hr>";
     
    echo "<br><h1>Infos sur les extensions chargees</h1><br>";
    print_r(get_loaded_extensions());
    echo "<hr>";
     
    echo "<br><h1>Test si l'extension MYSQLI est presente</h1><br>";
    if (extension_loaded('mysqli')) {
        echo "<br> Yes! tu as l'extension MYSQLI<br>";
    }
    echo "<hr>";
     
    echo "<br><h1>Infos sur le chemin du php.ini</h1><br>";
    $inipath = php_ini_loaded_file();
    if ($inipath) {
        echo 'chemin du php.ini = ' . $inipath;
    } else {
        echo "Aucun fichier php.ini n\'a ete charge";
    }
    if ($filelist = php_ini_scanned_files()) {
        if (strlen($filelist) > 0) {
            $files = explode(',', $filelist);
    		echo "<ul>";
            foreach ($files as $file) {
                echo "<li>" . trim($file) . "</li>\n";
            }
    		echo "</ul>";
        }
    }
    echo "<hr>";
     
     
    echo "<br><h1>Infos sur les modules</h1><br>";
    phpinfo(INFO_MODULES);
     
    echo "<br><h1>Infos generales  (dont le chemin du fichier PHP.ini)</h1><br>";
    phpinfo(INFO_GENERAL);
     
    ?>


    L'informatique, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
    - Ne vous privez pas pour voter pour ma réponse si elle vous plaît bien
    - Ne pas hésiter à cliquer sur "Résolu" quand votre problème posé a trouvé une solution. Et un petit merci fait toujours plaisir

Discussions similaires

  1. Tâches cron qui ne s'exécutent pas
    Par tamiii dans le forum Ubuntu
    Réponses: 7
    Dernier message: 19/07/2009, 08h21
  2. tâche cron qui ne marche pas
    Par polace dans le forum Administration système
    Réponses: 6
    Dernier message: 13/11/2007, 10h21
  3. recherche service gratuit de tâches cron
    Par php_de_travers dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 13/11/2005, 13h18
  4. un service qui refuse de se lancer
    Par unNew dans le forum Windows XP
    Réponses: 3
    Dernier message: 22/10/2005, 01h31

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