Structure fichier php pour une tache CRON

WRInaute passionné
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:
 
WRInaute accro
poupilou a dit:
As-tu une idée pour les redirections ?
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 ;-)
 
WRInaute passionné
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.
 
WRInaute accro
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.
 
WRInaute impliqué
poupilou a dit:
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 ?

oui, mettre des echo entre te permettra de le verifier.
 
WRInaute passionné
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à ?
 
WRInaute accro
poupilou a dit:
qu'est-ce que je peux rajouter comme code à la fin de mon fichier php pour lui faire comprendre de s'arrêter là ?
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
 
WRInaute accro
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
 
WRInaute passionné
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 ?
 
Discussions similaires
Haut