-
Requêtes et saturation
Bonjour,
Une question d'ordre générale concernant PHP.
J'ai une boucle foreach qui doit traiter de lourds tableaux, les convertir et les écrire dans un fichier local en csv.
Ce script est hébergé sur un serveur mutualisé OVH assez basique.
Jusqu'ici j'ai toujours développé mes petits bouts de code sans me soucier de l'impact sur ce qui moulinait derrière.
Je n'ai aucune idée de l'estimation des ressources nécessaires pour exécuter un tel script, s'il existe une limitation dans le traitement de lourdes opérations, si cela peut affecter la disponibilité du site pour les visiteurs qui passent à ce moment là...
Par ailleurs comment je pourrais-je avoir un feed-back de la progression de cette tâche, genre incrémenter une barre de chargement à chaque nouvelle boucle (ajax) ?
Est-il possible/intéressant de mettre une sorte de pause dans l’exécution du script, genre toutes les X boucles ?
Auriez-vous des liens vers de la documentation qui traite de ce sujet ?
Merci pour vos lumières 😊
-
Salut,
Le script ne doit pas être bloquant, regarde peut-être du côté asynchrone. Pourquoi ne pas utiliser un cron job qui fait tourner le script la nuit par exemple? Cela va dépendre du déclencheur.
Pour les optimisations ce qui est lourd ce n'est pas le php en lui même c'est (accès aux bdd, écriture de fichier, réflexion du code...) du coup si tu peux préparer ton output et écrire d'un coup dans le fichier c'est parfait ( attention à la gestion d'erreur).
Par contre si tu n'a pas les ressources processeurs il ni a pas de magie :)
Pour la barre de progressions un compteur sur 100 fera l'affaire, je crois que la plus part des barres de progressions ne sont pas précises.
Ce n'est que mon avis :)
-
Bonjour.
"De lourds tableaux" est plutôt flou. Tu as un ordre de grandeur pour la volumétrie ?
Par ailleurs, je suppose que tu utilises une base SQL. Es-tu certain d'avoir très bien modélisé cette partie ?
Enfin, j'insiste sur ce point de Lexarino : Tu peux passer du SQL à l'écriture du CSV sans passer par un énorme tableau PHP mais en intégrant ton écriture direct dans ta boucle avec une variable réaffectée à chaque tour.
-
Merci pour vos retours. C'est très intéressant pour un autodidacte comme moi !
En réalité il n'y a pas de passage en base de données :
J'importe un document JSON qui fait 20 Mo et je le convertis en csv après y avoir pioché les éléments qui m'intéressent.
Je viens de lancer le script et je suis.. stupéfait de voir que le CSV final est généré instantanément !
Le tableur final fait 750 ko et contient 1000 lignes.
J'ai très probablement sous-estimé la puissance de traitement.. c'est assez impressionnant car lorsque j'ouvre le json dans un navigateur, il me faut bien 3 bonnes minutes.
Effectivement @kevin254kl je passerais par un Cron lancé en milieu de nuit.
Oui @Dendrite c'est une boucle qui réaffecte les mêmes variables à chaque tour.
Le script en lui-même ne fait que quelques lignes.
Vous savez si on peut voir la "surcharge" que représente un script sur le serveur où il s'exécute ?
Genre chez OVH y a t-il un endroit ou il aurait un graph reflétant l'activité et son influence sur la disponibilité du serveur ?
En tout cas merci !
-
Sur un mutualisé tu ne pourras pas le voir et ce n'est pas réellement ton problème.
Ton problème est simplement que ton script s’exécute dans les limites (temps d'execution et ram) imposé par le serveur.
Le principale problème que tu peux rencontrer , plus que le processeur , ca va être la RAM. jsond_decode() , reproduit tout le fichier en RAM , donc fichier de 20Mo = au minimum 20Mo de RAM. Si le fichier fait 500Mo ca va vite devenir problématique.
Pour pallier à ca il existe des librairies qui ne garde ps tout en mémoire comme json-machine