Comment exécuter plusieurs requêtes automatiquement ?

Eléphant du PHP | 115 Messages

16 sept. 2009, 10:20

Bonjour à tous,

Question du jour:
J'ai un fichier php qui traite une fonction. Or cette fonction met beaucoup de temps a être traitée. Ex:
function nettoyage(param1,param2){
....
}

nettoyage (100,75);
nettoyage (75,50);
nettoyage (50,25);
nettoyage (25,01);
Comment faire pour appeler plusieurs fois une fonction mais que cela soit considéré comme différente requêtes (et éviter ainsi les coupures du serveur) ?

Ou sinon comment exécuter des fichier php les uns après les autres... #-o
Quelques réalisations www.cdi-interactiv.com

ViPHP
ViPHP | 928 Messages

16 sept. 2009, 10:58

Salut,
pourquoi ne pas désactiver le temps d'execution maximale de la page ?
set_time_limit(0)

Eléphant du PHP | 199 Messages

16 sept. 2009, 11:16

Désactiver le temps maximum ne serait pas enlevé une sécurité à php?

Mammouth du PHP | 965 Messages

16 sept. 2009, 11:56

function nettoyage($array()){
  foreach() {

    sleep()
  }
}

nettoyage (array(100 => 75, 75 => 50, 25 => 01));
Ca te permet d'avoir toute les entrées d'un coup et de faire des sleep() au cas ou l'exécution prends du temps. Mais je sais pas si c'est ce que tu cherche à faire.

ViPHP
ViPHP | 928 Messages

16 sept. 2009, 12:01

@Superpilou : si ton script lance une boucle infinie oui ça sera pas bon effectivement ... d'où l'importance de toujours bien tester ses scripts, surtout quand il s'agit de batchs qui vont agir sur l'ensemble de la base de donnée.

Mammouth du PHP | 991 Messages

16 sept. 2009, 12:06

Je ne pense pas que sleep soit une bonne chose dixit la doc :
max_execution_time entier

Fixe le temps maximal d'exécution d'un script, en secondes. Cela permet d'éviter que des scripts en boucles infinies saturent le serveur. La configuration par défaut est de 30 secondes. Lorsque PHP fonctionne depuis la ligne de commande, la valeur par défaut est 0.

Le temps d'exécution maximum n'est pas affecté par des appels systèmes tels que sleep(). Reportez-vous à la fonction set_time_limit() pour plus de détails.

Vous ne pouvez pas modifier la valeur de cette directive avec ini_set() lorsque PHP est configuré en safe mode. Le seul moyen de le faire est de désactiver le safe mode ou de changer la valeur dans php.ini.

Votre serveur web peut avoir d'autres configurations de la durée limite d'exécution qui peuvent également interrompre PHP. Apache a une directive Timeout et IIS a une fonction CGI pour cela. Par défaut, elles valent toutes les deux 300 secondes. Reportez-vous à la documentation de votre serveur web pour plus de détails.
http://www.php.net/manual/fr/info.confi ... ution-time

En mon sens, je pense qu'un découpage par plage de donnée du genre : index.php?min=0&max=10 etc serait plus approprié


EDIT :
ce code :
<?php

for ($i = 0 ; $i <= 120 ; $i++)
{

	echo $i.'<br />';
	sleep(1);
	
}

?>
Avec un limite de 60 secondes affiches a la 60ème secondes :
Fatal error: Maximum execution time of 60 seconds exceeded in .... on line 9.
CQFD

Bye Hawk
DevOps, Symfony4, Hoa

Eléphant du PHP | 115 Messages

16 sept. 2009, 14:45

Merci à tous pour vos idées mais je n'execute pas de boucle mais il est vrai que mes requetes sont tres longues à exécuter (4min30 en moyenne).
Donc pas de soucis pour les coupures.

Le problème, c'est pour les enchainer...
Je dois mettre à jour mon fichier php et l'uploader après que chaque requête soit exécutée...
Et c'est long.... :cry:

Voyez-vous mieux mon problème ?
Quelques réalisations www.cdi-interactiv.com

ViPHP
AB
ViPHP | 5818 Messages

16 sept. 2009, 16:51

J'ai peut être pas saisi ton problème (faudrait être plus précis) mais une tâche automatisée peut-être, un cron ?

Eléphant du PHP | 115 Messages

16 sept. 2009, 17:21

Résumé:
un fichier php exécute une fonction nettoyage(). Il met env. 4min30 pour l'executer.
Je cherche a exécuter plusieurs fois cette page php mais avec des paramètres différents.

Si je met tout ds un même fichier:
nettoyage(1);
nettoyage(2);
nettoyage(3);
....
ca va coincer.

Donc, un cron pourquoi pas mais ca me fait faire bcp de cron à créer... :shock:
Quelques réalisations www.cdi-interactiv.com

ViPHP
AB
ViPHP | 5818 Messages

16 sept. 2009, 17:36

Ben ne pourrais-tu pas avec un seul fichier php, générer différents nettoyages, en enregistrant un pointeur pour ceux déjà exécutés dans un fichier texte ou en bdd... ? Cela ne te ferait qu'un cron à créer mais que tu pourrais faire exécuter à interval de temps défini.

Eléphant du PHP | 115 Messages

16 sept. 2009, 17:44

Merci! Ca m'interesse !

Mais je ne sais pas ce qu'est un pointeur...
Hum hum. Je vais faire des recherches...
Quelques réalisations www.cdi-interactiv.com

ViPHP
AB
ViPHP | 5818 Messages

16 sept. 2009, 18:03

Un pointeur c'est un terme générique pour dire "mémoriser l'endroit où tu en est dans ton traitement" :wink:
Donc tu enregistre d'une manière ou d'une autre ce que tu as déjà fait pour pouvoir continuer le processus au bon endroit au traitement suivant.

Un pointeur en informatique c'est l'équivalent d'un marque page en littérature :)

Eléphant du PHP | 115 Messages

21 sept. 2009, 15:03

Belle comparaison!

Effectivement, la solution que j'ai trouvé et de sauvegarder la dernière action effectuée dans une table et de rafraichir la page toutes les 10min.
Comme ça, tout marche bien.

Merci!

[EDIT]Eh ba non, ca marche pas...
La META refresh ne fonctionne pas tant que le script php est exécuté...
Pareil si je garde la META et execute le script dans une IFRAME....

Si quelqu'un à une idée..
Quelques réalisations www.cdi-interactiv.com

ViPHP
AB
ViPHP | 5818 Messages

22 sept. 2009, 18:06

Je pensais que tu étais parti pour essayer des taches automatisées. Renseignes toi sur les termes "cron" ou "tâches automatisées" et oublies ces meta refresh
Il y a un sujet sur les crons ici