8791 sujets

Développement web côté serveur, CMS

Salut tout le monde,

J'ai plusieurs scripts PHP qui doivent être exécutés chaque nuit. Au lieu de créer autant de tâches que j'ai de scripts à exécuter, j'ai créer une seule tâche planifiée qui appele un seul fichier PHP.

C'est à partir de ce fichier PHP (par exemple : "page_principale.php") que seront appelés les autres scripts PHP.

Je rencontre deux difficultés :
- si le premier script plante, il ne doit pas arrêter l'exécution de "page_principale.php" qui doit encore exécuter les autres scripts PHP ;
- comment appeler chacun de ces scripts PHP ? à l'aide de la fonction exec() ? Si oui, comment l'utiliser ? Si non, que me proposez-vous en tenant compte de ma première question ?

J'espère avoir été clair. Merci d'avance.
salut Smiley smile

TU utilises plusieurs cron actuellement !!! Smiley lol

Tu utilises donc LA SEULE solution sécurisé et efficace pour tes fichiers....

Faut pas chercher à avoir une seule tache qui fait tout c'est source d'emmer....s

A l'extrème limite tu peux regrouper certaines taches SURES dans leur fonctionnement dans le même fichier...

Mais de toute façon ce que tu utilise actuellement est la méthode la plus sure, la plus efficace et la moins gourmande en charge serveur Smiley cligne
Non, je ne veux pas utiliser plusieurs tâches planifiées. Je veux (et je dois) en utiliser qu'une seule.

Ma seule tâche planifiée appelle une page qui ne devrait jamais planter car elle ne fera qu'appeler les autres tâches planifiées. Sauf que je ne sais pas quelle fonction PHP utiliser pour effectuer cet appel : fonction exec() ?
salut...

Bon alors si tu y tiens tant que ça Smiley smile

SIMPLE

même dans un cron le php est exécuté comme du php... donc des includes devraient suffire

sinon tu peux tout regrouper dans le même fichier...

exec devrait aussi fonctionner... mais il faut que tu sois sur du chemin et aussi des droits de ton fichier source...
Je dois juste encore vérifier que si mon premier include() tombe en erreur (à cause d'une erreur de syntaxe PHP ou que sais-je), que mon script principal continue à être exécuté.

J'avais écarté d'office l'utilisation des include() mais j'essayerai de tester demain au plus tard avant d'envisager d'utiliser exec().
Les includes sont fait avant l'exécution. Si un de tes includes a une erreur de syntaxe, rien ne sera exécuté, si un de tes includes provoque une erreur fatale, l'execution du reste de scripts ne sera pas faite.

J'imagine que tu ne veux pas faire plusieurs tâches cron parce que tes scripts doivent être exécutés dans l'ordre, et que le suivant ne doit pas se lancer tant que le précédent n'est pas terminé? (seule raison valable a mon avis)

Dans ce cas il suffit de configurer une seule tâche cron avec plusieurs commandes, un truc dans ce style

0 2 * * * /usr/bin/php  /path-to-scripts/monscript1.php; /usr/bin/php  /path-to-scripts/monscript2.php; /usr/bin/php  /path-to-scripts/monscript3.php;


Programmée comme cela, la tâche cron executera les scripts dans l'ordre, les uns après les autres sans qu'une erreur déclanchée par un script stoppe les autres...

Sinon reste en effet la solution des exec(), system() shell() et compagnie mais encore une fois ça fais un script de plus à maintenir...
a écrit :
J'imagine que tu ne veux pas faire plusieurs tâches cron parce que tes scripts doivent être exécutés dans l'ordre, et que le suivant ne doit pas se lancer tant que le précédent n'est pas terminé? (seule raison valable a mon avis)

Non, aucune importance sur l'ordre des tâches.

Le fait d'avoir une seule tâche planifiée qui appelle un seul script PHP me facilite la vie au niveau de la maintenance de toutes mes tâches planifiées. Je m'explique : si je veux ajouter/supprimer des tâches, je modifie uniquement ma page principale PHP puisque c'est elle qui va appeler les tâches (grâce à exec() ou autres). Dans l'autre cas, si je dois ajouter/supprimer une tâche planifiée, je dois modifier mon cron/schedule tasks : cette solution ne m'intéresse pas !

J'ai réussi à faire fonctionner la fonction exec() et à récupérer les codes d'erreur. J'avais un problème dans le chemin de mon fichier principal que je pensais à un endroit alors qu'il était ailleurs... Smiley biggol

Je mettrai mon sujet résolu lorsque j'aurai réellement fini mon script. J'y mettrai un exemple de code.
Comme promis, voici à quoi ressemble ma tâche planifiée.

Un fichier PHP appelé (= tâche principale) qui exécute les autres tâches. Si une tâche plante, ça ne bloque pas l'exécution des autres tâches.
// Aucune limite du temps d'execution du script n'est imposee
set_time_limit(0);

// Definition de mes constantes
define('PATH_PHP', '...'); // Chemin de l'executable PHP
define('PATH_TASK', '...'); // Chemin physique ou se trouvent mes scripts PHP

// Tableau contenant les fichiers a appeler
$arrScripts = array(
	'tache_01.php', 
	'tache_02.php',
	'tache_03.php'
);

// On parcourt le tableau contenant les scripts
foreach($arrScripts as $script) {
	// Verification de l'existance de la variable
	if(isset($arrOutput))
		// Destruction de la variable
		unset($arrOutput);

	// Execute un fichier PHP
	exec(PATH_PHP.' '.PATH_TASK.$script, $arrOutput, $returnVar);

	// Controle du statut de retour d'execution
	if($returnVar != 0)
		// Envoi du mail en cas d'erreur
		sendMailScheduleTask($script, $arrOutput, $returnVar);
}


edit: Résolu !
Modifié par Alphonse (06 Sep 2010 - 15:21)