Alternatives à l'éxécution trop longue d'un script

Eléphanteau du PHP | 31 Messages

14 févr. 2011, 12:45

Bonjour à tous. Je débute en PHP et je commence à vouloir faire des choses un chouya plus compliqué. En l'occurrence, j'ai un script qui check dans une base de donnée qui peut être large pour tester une liste d'URL utilisant cUrl et ça prend du temps...
Alors j'ai regardé du côté de jQuery UI et de la progress bar, mais je n'arrive pas à m'en servir correctement, je n'arrive pas à "streamé" le pourcentage d'avancement du script (que je flush dans une variable). Je pense que ça doit être possible, je ne sais juste pas comment le faire sinon.
Egalement, la solution pourrait être de lancer le script sur une autre page qui tournerait en "background" et ne gênerais pas la navigation pour l'utilisateur. Ca non plus, je ne sais pas comment le faire, peut-être n'est-ce pas possible.

Alors voilà, ma question est: qu'est ce que vous faites lorsque vous avez un script qui prend du temps à charger et que vous ne voulez pas freezer la page?

Merci d'avance!

ViPHP
ViPHP | 3607 Messages

14 févr. 2011, 13:58

Bonjour,
Des éléments de réponses ici : javascript-ajax/affichage-pendant-trait ... ml#p348966

Mammouth du PHP | 672 Messages

14 févr. 2011, 14:02

Alors voilà, ma question est: qu'est ce que vous faites lorsque vous avez un script qui prend du temps à charger et que vous ne voulez pas freezer la page?
Bonjour.

Dans un cas comme ça :

1. Je revois la logique du programme/la BDD.
Sauf cas exceptionnel, un traitement long est signe d'une erreur dans la conception.

2. Si j'ai bien suivi, ton script récupère une liste d'URL via SQL, puis utilise des fonctions cURL pour tester la validité.
C'est faisable en AJAX, en deux temps :
- Une fonction JS appele un script php qui va récupérer le contenu de la table. On récupère un tableau d'URL (tu peux utiliser le résultat pour ta barre de progression).
- POUR CHAQUE URL, une deuxième fonction JS va appeler un script php qui va s'occuper du cURL.

Eléphanteau du PHP | 31 Messages

14 févr. 2011, 14:33

Merci à vous deux. Donc je vais regarder pour AJAX et Javascript, mais je n'y connais vraiment rien alors je ne sais pas si je vais y arriver. Je vais essayer quand même.

Mais sinon, réduire le temps d'exécution du script serait préférable! Alors, je ne sais pas comment optimiser mon code pour en augmenter la rapidité. Je pense avoir déjà optimisé mes requêtes SQL, et le stockage des urls dans une array(). Ce qui prend du temps c'est cURL. Une seule requête est faite à la fois et attends la réponse pour commencer la suivante. Alors, ce qui serait bien, c'est que je puisse ouvrir plusieurs connections, ou trouver une alternative. Je suis tombé sur un script EpicURL.php mais je ne sais pas si ça pourrait m'être utile. Sinon, j'ai lu un truc à propos de curl_multi_exec mais là non plus, je ne sais pas si c'est vraiment pertinent pour mon script.

Excusez moi, j'ai débuté PHP il y a quelques semaines seulement.

Merci.

ViPHP
ViPHP | 2577 Messages

14 févr. 2011, 15:43

Bonjour,

Il y a 2 sortes de traitements, les traitements batch et les traitements temps réel. Dans le cas d'un traitement impliquant beaucoup de données et ne nécessitant pas d'intervention de l'utilisateur, il vaut mieux utiliser le lancement du script en ligne de commande sans passer par apache (php.exe toto.php)

ViPHP
ViPHP | 5462 Messages

14 févr. 2011, 17:22

si tu veux montre ton script y'a sans doute des optimisations a faire :wink:

Eléphanteau du PHP | 31 Messages

15 févr. 2011, 14:24

En fait le problème ne vient pas de mon script, j'ai essayé de faire un script "light" sans aucunes connections à une DB ni rien d'autre qu'une array d'URL à tester et ça prend exactement le même temps. Ce qu'il me faut c'est une meilleure gestion des cUrl.

Eléphanteau du PHP | 31 Messages

15 févr. 2011, 17:07

Bon, en fait j'ai trouvé. En utilisant EpicUrl correctement, cette classe m'a permit de beaucoup mieux gérer les requêtes et les réponses. Donc là, mon script peut checker, analyser la réponse, la stocker dans SQL de 90 liens en 45 secondes...
Ce script est un cronjob, alors pas grave si ça met un peu de temps à s'afficher, l'utilisateur ne le verra pas.

Pour mon autre script qui faisait à peu près la même chose (sauf que là je n'avais pas besoin d'attendre la réponse), la classe EpicUrl s'en charge en background et c'est immédiat.

Alors voilà, problème résolu!!

Merci à tous!