Mon cron-job ne fonctionne plus

Résolu
bonjour a tous

j ai un cron-job fonctionnel et je souhaiterais en faire une tache quotidienne

je suis hébergé chez hostinger et je souhaite donc mettre mon cron-job dans une tache a exécuter tous les jours

j ai suivi ce tuto
https://www.hostinger.fr/tutoriels/cron-jobs

alors que mon cron-job fonctionne de façon manuelle il ne fonctionne plus une fois mis en place
dans les taches

lorsque je dis qu il ne fonctionne plus
c est que rien ne se passe ...

11 réponses

  1. B'jour,

    On ira pas loin si on ne sait pas à quoi ressemble ta cron.
    1
    1. Modérateur
      Bonjour,

      Et que t'affiche le bouton "Afficher les résultats" :
      https://www.hostinger.fr/tutoriels/wp-content/uploads/sites/9/2017/05/supprimer-cron-hostinger.png

      Et comme le dit Pyraah .. si tu ne nous montres pas le code de ta cron ( le script ( php je suppose) que tu essayes d'exécuter).. impossible de t'en dire plus.
      ( à part, pense à activer l'affichage des erreurs php dans ton code, et places de echo / var_dump .. pour essayer de voir ce que fait (ou non) ton script )

      1
      1. C'est ta cron que j'ai demandé à voir, pas le code PHP :).

        Edit : je laisse Jordane et Pitet prendre le relais, n'étant pas certain de pouvoir répondre ce soir :).
        1
        1. bonjour merci pour l aide
          le voici

          <?php
          /**
           * Sauvegarde MySQL
           *
           * @package BackupMySQL
           * @author Benoit Asselin <contact@ab-d.fr>
           * @version backup.php, 2013/01/13
           * @link http://www.ab-d.fr/
           *
           */
          
          
          error_reporting(E_ALL);
          ini_set('display_errors', true);
          
          
          /**
           * Sauvegarde MySQL
           */
          class BackupMySQL extends mysqli {
           
           /**
            * Dossier des fichiers de sauvegardes
            * @var string
            */
           protected $dossier;
           
           /**
            * Nom du fichier
            * @var string
            */
           protected $nom_fichier;
           
           /**
            * Ressource du fichier GZip
            * @var ressource
            */
           protected $gz_fichier;
           
           
           /**
            * Constructeur
            * @param array $options
            */
           public function __construct($options = array()) {
            $default = array(
             'host' => ini_get('mysqli.default_host'),
             'username' => ini_get('mysqli.default_user'),
             'passwd' => ini_get('mysqli.default_pw'),
             'dbname' => '',
             'port' => ini_get('mysqli.default_port'),
             'socket' => ini_get('mysqli.default_socket'),
             // autres options
             'dossier' => 'phil/backup/',
             'nbr_fichiers' => 5,
             'nom_fichier' => 'backup'
             );
            $options = array_merge($default, $options);
            extract($options);
            
            // Connexion de la connexion DB
            @parent::__construct($host, $username, $passwd, $dbname, $port, $socket);
            if($this->connect_error) {
             $this->message('Erreur de connexion (' . $this->connect_errno . ') '. $this->connect_error);
             return;
            }
            
            // Controle du dossier
            $this->dossier = $dossier;
            if(!is_dir($this->dossier)) {
             $this->message('Erreur de dossier "' . htmlspecialchars($this->dossier) . '"');
             return;
            }
            
            // Controle du fichier
            $this->nom_fichier = $nom_fichier . date('Ymd-His') . '.sql.gz';
            $this->gz_fichier = @gzopen($this->dossier . $this->nom_fichier, 'w');
            if(!$this->gz_fichier) {
             $this->message('Erreur de fichier "' . htmlspecialchars($this->nom_fichier) . '"');
             return;
            }
            
            // Demarrage du traitement
            $this->sauvegarder();
            $this->purger_fichiers($nbr_fichiers);
           }
           
           /**
            * Message d'information ( commenter le "echo" pour rendre le script invisible )
            * @param string $message HTML
            */
          protected function message($message = ' ') {
            echo '<p style="padding:0; margin:1px 10px; font-family:sans-serif;">'. $message .'</p>';
            file_put_contents( __DIR__ . 'log_'.date("Y-m-d").'.log', date("Y-m-d H:i:s") . ' - ' . $message . PHP_EOL, FILE_APPEND);
           }
           
           /**
            * Protection des quot SQL
            * @param string $string
            * @return string
            */
           protected function insert_clean($string) {
            // Ne pas changer l'ordre du tableau !!!
            $s1 = array( "\\" , "'" , "\r", "\n", );
            $s2 = array( "\\\\" , "''" , '\r', '\n', );
            return str_replace($s1, $s2, $string);
           }
           
           /**
            * Sauvegarder les tables
            */
           protected function sauvegarder(){
            $this->message('Sauvegarde...');
            
            $sql  = '--' ."\n";
            $sql .= '-- '. $this->nom_fichier ."\n";
            gzwrite($this->gz_fichier, $sql);
            
            // Liste les tables
            $result_tables = $this->query('SHOW TABLE STATUS');
            if($result_tables && $result_tables->num_rows) {
             while($obj_table = $result_tables->fetch_object()) {
              $this->message('- ' . htmlspecialchars($obj_table->{'Name'}));
              
              // DROP ...
              $sql  = "\n\n";
              $sql .= 'DROP TABLE IF EXISTS `'. $obj_table->{'Name'} .'`' .";\n";
          
              // CREATE ...
              $result_create = $this->query('SHOW CREATE TABLE `'. $obj_table->{'Name'} .'`');
              if($result_create && $result_create->num_rows) {
               $obj_create = $result_create->fetch_object();
               $sql .= $obj_create->{'Create Table'} .";\n";
               $result_create->free_result();
              }
          
              // INSERT ...
              $result_insert = $this->query('SELECT * FROM `'. $obj_table->{'Name'} .'`');
              if($result_insert && $result_insert->num_rows) {
               $sql .= "\n";
               while($obj_insert = $result_insert->fetch_object()) {
                $virgule = false;
                
                $sql .= 'INSERT INTO `'. $obj_table->{'Name'} .'` VALUES (';
                foreach($obj_insert as $val) {
                 $sql .= ($virgule ? ',' : '');
                 if(is_null($val)) {
                  $sql .= 'NULL';
                 } else {
                  $sql .= '\''. $this->insert_clean($val) . '\'';
                 }
                 $virgule = true;
                } // for
                
                $sql .= ')' .";\n";
                
               } // while
               $result_insert->free_result();
              }
              
              gzwrite($this->gz_fichier, $sql);
             } // while
             $result_tables->free_result();
            }
            gzclose($this->gz_fichier);
            $this->message('<strong style="color:green;">' . htmlspecialchars($this->nom_fichier) . '</strong>');
            
            $this->message('Sauvegarde terminée !');
           }
           
           /**
            * Purger les anciens fichiers
            * @param int $nbr_fichiers_max Nombre maximum de sauvegardes
            */
           protected function purger_fichiers($nbr_fichiers_max) {
            $this->message();
            $this->message('Purge des anciens fichiers...');
            $fichiers = array();
            
            // On recupere le nom des fichiers gz
            if($dossier = dir($this->dossier)) {
             while(false !== ($fichier = $dossier->read())) {
              if($fichier != '.' && $fichier != '..') {
               if(is_dir($this->dossier . $fichier)) {
                // Ceci est un dossier ( et non un fichier )
                continue;
               } else {
                // On ne prend que les fichiers se terminant par ".gz"
                if(preg_match('/\.gz$/i', $fichier)) {
                 $fichiers[] = $fichier;
                }
               }
              }
             } // while
             $dossier->close();
            }
            
            // On supprime les  anciens fichiers
            $nbr_fichiers_total = count($fichiers);
            if($nbr_fichiers_total >= $nbr_fichiers_max) {
             // Inverser l'ordre des fichiers gz pour ne pas supprimer les derniers fichiers
             rsort($fichiers);
             
             // Suppression...
             for($i = $nbr_fichiers_max; $i < $nbr_fichiers_total; $i++) {
              $this->message('<strong style="color:red;">' . htmlspecialchars($fichiers[$i]) . '</strong>');
              unlink($this->dossier . $fichiers[$i]);
             }
            }
            $this->message('Purge terminée !');
           }
           
          }
          
          
          
          // Instance de la classe ( a copier autant que necessaire, mais attention au timeout )
          // Rq: pour les parametres, reprendre une ou plusieurs cles de $default ( dans la methode __construct() )
          new BackupMySQL(array(
           'username' => 'u4',
           'passwd' => '',
           'dbname' => 'u4'
           ));
          
          //new BackupMySQL(array(
          // 'username' => 'root',
          // 'passwd' => 'root',
          // 'dbname' => 'mabase',
          // 'dossier' => './dossier2/'
          // ));
          
          
          
          ?>
          0
          1. Bonjour,

            A priori ton code crée un fichier log_<date>.log dans le même dossier où est situé le fichier php. Il y t-il une erreur dans ce fichier log ?

            Au passage, pense à masquer/modifier l'utilisateur et le mot de passe mysql sur le code posté sur un forum si ce n'est pas déjà le cas.
            0
          2. @Pitetbonjour Pitet
            merci pour la réponse en effet il crée un log quand tout c est bien passe
            mais comme rien ne se passe je n ai pas de log
            0
        2. bonjour jordane

          je précise que ce script exécuter en manuel fonctionne

          je place ou ces echo var_dump jordane

          voici la capture d écran
          0
          1. Modérateur
            ben visiblement il ne trouve pas le fichier ...
            Comment as tu créés ta cron ?
            Quel chemin à tu mis pour le fichier à exécuter ?
            Où est-il placé dans l'arborescence de ton site ?
            0
          2. @jordane45oui jordane c est bien ça il ne trouve pas le fichier
            voici mon dernier chemin en essai
            mais je dois attendre 30 mm pour savoir si cela fonctionne a présent

            /usr/bin/php /home/u43/Domains/pecheperle.be/public_html/backup.php

            et le fichier backup.php
            est placé a la racine de mon domaine
            0
        3. voici la liste des taches cron
          ce sont tous des essais mais aucun fonctionne

          0
          1. Modérateur
            et c'est lequel que tu nous as montré ( au niveau de la fenêtre résultat ) ?
            0
          2. Modérateur
            @jordane45Si c'est le dernier de la liste .. il me semble normal qu'il ne fonctionne pas...
            Regarde comment sont fais les autres...
            0
        4. merci de l aide
          voila cela ne fonctionne toujours pas
          aucun de la liste ne fonctionne
          en fait ils s affichent tous le même résultat
          a savoir qu il ne trouve pas le fichier
          0
          1. La constante __FILE__ en php contient le chemin du script exécuté.

            Tu peux donc par exemple afficher cette constante au début de ton fichier backup.php :
            <?php
            /**
             * Sauvegarde MySQL
             */
            
            error_reporting(E_ALL);
            ini_set('display_errors', true);
            
            echo __FILE__;
            exit();
            

            Puis appeler ce fichier dans ton navigateur pour vérifier le chemin.

            Pense bien sûr à supprimer ces deux nouvelles lignes pour tester à nouveau la tache cron avec le bon chemin.
            0
        5. merci pour le code
          je viens d essayer de mettre le chemin que j ai obtenu comme tache de cron
          mais cela ne fonctionne toujours pas
          /home/u43/domains/pecheperle.be/public_html/backup.php

          et le resultaat comme message

          est ceci

          timeout: failed to run command ‘/home/u435/domains/pecheperle.be/public_html/backup.php’: Permission denied

          apparemment il refuse l accès au dossier
          0
          1. Dans la commande de la tâche cron il ne faut pas mettre uniquement le chemin, il faut appeler l'exécutable php (dans le dossier /usr/bin) puis renseigner le chemin php à exécuter.

            La syntaxe de ton dernier essai était correct, la seule différence sur le chemin semble être l'absence de majuscule sur le dossier domains. La commande de la tâche cron devrait donc être :
            /usr/bin/php /home/u43/domains/pecheperle.be/public_html/backup.php 
            0
        6. ah je pense que on est sur la bonne voie , merci pour cette modification
          voici le nouveau message d erreur

          <p style="padding:0; margin:1px 10px; font-family:sans-serif;">Erreur de dossier "phil/backup/"</p>


          je dois peut être mettre el dossier de récupération dans le même endroit que le fichier backup.php

          voila je viens d essayer de mettre le dossier backup a la racine
          en changeant bien évidement le chemin dans backup .php

          mais toujours ce message

          <p style="padding:0; margin:1px 10px; font-family:sans-serif;">Erreur de dossier "backup/"</p>


          j ai essaye aussi en mettant le chemin complet

          /usr/bin/php /home/u43/domains/pecheperle.be/public_html/

          pourtant si je lance le backup en manuel cela fonctionne
          0
          1. En effet le script php est désormais bien exécuté.

            Concernant le dossier, est-ce que tu as créé un dossier backup dans le dossier public_html ?
            Si oui, essaye de renseigner le chemin absolu vers ce dossier dans l'option dossier :
            new BackupMySQL(array(
                'username' => 'root',
                'passwd' => '123456',
                'dbname' => 'mabase',
                'dossier' => '/home/u43/domains/pecheperle.be/public_html/backup/'
            ));
            
            0
        7. bonjour Pitet

          merci pour la réponse et la solution
          note bien qu hier j avais fait un essai avec le chemin absolu et cela n avait pas fonctionner
          a présent tout semble fonctionner a merveille

          j attends encore un peu avant d indiquer en résolu

          encore mille fois merci
          tu m enlèves une fameuse aiguille du pied
          0
          1. je confirme cela fonctionne
            merci et bonne journée
            0