Structure fichier php pour une tache CRON

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par poupilou, 5 Juillet 2014.

  1. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    876
    J'aime reçus:
    11
    Salut à tous,

    J'espère qu'ils ne sont pas tous à la plage :mrgreen:

    Je souhaite lancer via une tache CRON un fichier php pour faire une mise à jour d'une de mes tables mysql.

    Pas de soucis pour programmer la tache CRON, je sais faire :D

    Ce qui me pose problème c'est que dans mon fichier php il y a pas mal de choses à faire (télécharger des données dans un fichier cvs, les charger ensuite dans une table mysql, nettoyer toutes les données de cette table, dupliquer des tables, les renommer, etc...). J'ai donc décidé de fractionner ces taches en structurant mon fichier php avec des if et else et j'utilise des redirections javascript pour dérouler le script, comme ceci :
    Code:
    <?php
    $chemin = "http://".$_SERVER['SERVER_NAME']."";
    if(isset($_GET['module']) && $_GET['module']=="creation_table")
    {
    // Ici mon code php, requête mysql, etc...
    ?>
    <script type="text/javascript">
    <!--
    setTimeout("window.location='<?php echo "$chemin/bdd.php?module=nettoyage_table";?>'",10000);
    //-->
    </script><?php
    }
    elseif(isset($_GET['module']) && $_GET['module']=="nettoyage_table")
    {
    // Ici mon code php, requête mysql, etc...
    }
    else
    {
    // Ici mon code php, requête mysql, etc...
    ?>
    <script type="text/javascript">
    <!--
    setTimeout("window.location='<?php echo "$chemin/bdd.php?module=creation_table";?>'",10000);
    //-->
    </script><?php
    }
    ?>
    
    Ce type de code fonctionne bien lorqu'on utilise un navigateur Internet mais ça ne fonctionnera pas pour une tache CRON.

    Comment faudrait-il faire pour que ces redirections javascript fonctionnent en tache CRON ?

    Merci pour votre aide et vos conseils :wink:
     
  2. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    9 153
    J'aime reçus:
    324
  3. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    876
    J'aime reçus:
    11
    Merci spout.

    Donc si je t'ai bien compris, je remplace mes $_GET['module'] par $argv['module'] dans mon code php, c'est bien ça ?

    As-tu une idée pour les redirections ?
     
  4. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 181
    J'aime reçus:
    1
    JS est exécuté par le navigateur donc ta tache CRON qui s'exécute dans un environnement serveur (et pas dans un navigateur) ne sera pas en mesure de l'exécuter ... tu peux donc oublier tout ce qui est JS HTML etc ...
    Dans le même esprit tu ne programme pas dans un environnement apache (php est exécuté directement par le système d'exploitation pas par dessus apache) donc tout ce qui est lié au serveur et au protocole http n'est pas disponible genre "$_GET['module']".

    Tu n'as pas non plu un temps d’exécution aussi limité qu'au travers d'une requête http et tu peux l'augmenter si c'est necessaire. En revanche si c'est un traitement vraiment long et que tu dois le fractionner alors pourquoi ne pas créer plusieurs entrée dans ta CRON Table afin que tes scripts soit lancés a plusieurs secondes ou minutes d'intervalle (ce qui règle ton souci de javascript). Il faudra toutefois t'assurer d'une façon ou d'une autre que le script précédent se sois déroulé normalement pour pas empiler une erreur d’exécution.

    Attention a tes chemins de fichiers, il seront relatifs au Système donc depuis la racine du disque et pas relatifs au dossier du site ;-)
     
  5. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    876
    J'aime reçus:
    11
    Merci mon petit pingouin préféré pour tes explications :)

    Je vais tenter de lancer une tache cron avec mon fichier php mais en supprimant toutes les redirections javascript dans ce fichier php.

    Si je structure mon fichier php comme cela :

    Code:
    <?php
    $newfile_1 = "".$chemin."/fichier.csv";
    $fp = fopen("$newfile_1","a+");
    mysql_query("LOAD DATA LOCAL INFILE '$newfile_1' INTO TABLE `$tableName` FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\\' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES") or die (mysql_error());
    fclose($fp);
    mysql_query("CREATE TABLE `$tableName_2` LIKE $table_1");
    mysql_query("INSERT INTO `$tableName_2` SELECT * FROM $table_1");
    $result = mysql_query("SELECT $tableName_2.num FROM $tableName_2 WHERE $tableName_2.num!='1' AND $tableName_2.num NOT IN (SELECT $tableName.num FROM $tableName)");
    while($voir = mysql_fetch_array($result))
    {
    mysql_query("DELETE FROM `$tableName_2` WHERE num=".$voir['num']."");
    }
    mysql_query("OPTIMIZE TABLE `$tableName`");
    mysql_query("OPTIMIZE TABLE `$tableName_2`");
    // etc...
    ?>
    
    Est-ce que toutes les requêtes mysql se feront bien les unes après les autres, dès que la précédente aura fini sa tache ?

    PS : mon fichier fichier.csv fait +/- 50Mo, il y a plusieurs milliers de lignes dans ce fichier et une quizaine de colonnes.
     
  6. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 181
    J'aime reçus:
    1
    Faut faire des tests, je ne peux pas te répondre comme ça. Perso je me connecte en ssh et je teste mes scripts directement depuis la ligne de commande pour voir les codes erreurs renvoyés c'est plus direct et assez simple.
     
  7. loubet
    loubet WRInaute impliqué
    Inscrit:
    19 Février 2003
    Messages:
    792
    J'aime reçus:
    0
    oui, mettre des echo entre te permettra de le verifier.
     
  8. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    876
    J'aime reçus:
    11
    Bon j'ai lancé sur mon serveur local (127.0.0.1) ma mise à jour d'un seul bloc (sans redirection javascript) et ça fonctionne bien, la mise à jour a mis quand même 6 minutes au total mais ça s'est bien passé :)

    J'ai fait un test sur mon serveur dédié en tache CRON avec ce même fichier php, la mise à jour de mes table mysql s'est bien passée mais apparemment la tache CRON ne s'arrête plus :( j'ai lancé la tache CRON manuellement depuis Webmin et ça n'a pas arrêté de mouliner, de mouliner et elle ne s'arrêtait plus, qu'est-ce que je peux rajouter comme code à la fin de mon fichier php pour lui faire comprendre de s'arrêter là ?
     
  9. jeanluc
    jeanluc WRInaute accro
    Inscrit:
    3 Mai 2004
    Messages:
    2 882
    J'aime reçus:
    0
    Rien. Un script PHP s'arrête tout seul une fois la dernière ligne exécutée. S'il ne s'arrête pas, c'est qu'il y a une erreur quelque part.

    Exécuter le script en SSH (comme suggéré par zeb) fournit souvent des messages d'erreur explicites. Et avec un script qui s'exécute normalement en 6 minutes, cela devrait te permettre d'avancer plus rapidement qu'en aveugle à travers une tâche cron.

    Jean-Luc
     
  10. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    876
    J'aime reçus:
    11
    Entendu, quelle ligne de commande il faut taper en SSH pour lancer ma tache CRON ?
     
  11. jeanluc
    jeanluc WRInaute accro
    Inscrit:
    3 Mai 2004
    Messages:
    2 882
    J'aime reçus:
    0
    La même ligne que dans le cron, mais sans le "> /dev/null 2>&1" que tu as sans doute à la fin de ta tâche cron.

    Jean-Luc
     
  12. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    876
    J'aime reçus:
    11
    J'ai lancé la tache CRON via SSH et il n'y a pas d'erreur, elle s'est arrêtée d'elle même au bout de 4 minutes, voici le message que j'ai après les 4 minutes :

    Code:
    X-Powered-By: PHP/5.2.13-pl1-gentoo
    Set-Cookie: PHPSESSID=4b3f5dad268ac292ca3a415ece859efe; path=/
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Content-type: text/html
    
    Donc c'est tout bon, non ?
     
Chargement...
Similar Threads - Structure fichier php Forum Date
Choix de balise de données structurées pour un service en ligne gratuit Débuter en référencement 31 Mars 2021
Redirection 301 Domaines et structures différentes URL Rewriting et .htaccess 26 Janvier 2021
Outils : test des données structurées et des rich snippets Référencement Google 16 Décembre 2020
Wordpress : quelles structure de page pour un meilleur référencement Crawl et indexation Google, sitemaps 30 Novembre 2020
Données structurées : quel @type Développement d'un site Web ou d'une appli mobile 20 Novembre 2020
Données structurées et pages listing e-commerce 28 Octobre 2020
Inclure prix mensuel dans les données structurées Référencement Google 9 Septembre 2020
Structure de page avec même contenu pour plusieurs villes ? Débuter en référencement 1 Septembre 2020
Améliorer son référencement avec les entités (et données structurées) Techniques avancées de référencement 24 Août 2020
WordPress Conseil sur la bonne structure des URL en répertoires Problèmes de référencement spécifiques à vos sites 19 Août 2020