OVH Community, votre nouvel espace communautaire.

parser de gros fichiers en évitant l'arret du script


johnny57
27/01/2015, 11h42
Parce qu'en fonction du contenu du fichier je m'adapte. J'ai besoin de table temporaire, d'actions en fonction de certains cas, de contrôle avant exécution, de lien vers l'image pour l'uploader sur la boutique mère. Après avoir inséré les produits il faut que je puisse les mettre à jour aussi.

si je ne faisais qu'un copier/coller sql comment je ferai ensuite pour faire la mise à jour des infos, pour savoir à quelle boutique appartient quel produit pour retransmettre les commandes ce genre de choses.

bbr18
27/01/2015, 11h24
Le max_execution_time est à 30 : c'est franchement très peu ces 30 s, tu pourrais le mettre à 300 comme c'est le cas par défaut sur les autres distributions
je ne comprends pas bien la logique des fichiers csv, pourquoi pas du sql ?

johnny57
27/01/2015, 10h53
@nowwhat

Monter le max_execution_time n'est pas une bonne idée pour un seul script je pense. Je préfère gérer au cas par cas. Au moins des scripts qui ne sont pas censé s'attarder seront coupé en cas de bug.

@janus57
Parce que je centralise le catalogue produit de plusieurs boutique sur une boutique centrale. L'id dans la table de la boutique centrale n'est donc jamais le même que dans la table de la boutique fille.

janus57
27/01/2015, 10h45
Bonjour,

et sinon pourquoi utiliser des fichiers CSV ?

Ce ne serait pas plus simple et plus propre de faire une réplication MySQL ?

Cordialement, janus57

Nowwhat
27/01/2015, 10h41
Euh ......

T'es sur un serveur dédié.
Si ton "max_execution_time" te plait pas, tu le change .... (dans le php.ini concernant).

Optimaliser le script est bien sur une meilleur solution.

johnny57
27/01/2015, 10h32
Bon, je pense que le problème est réglé.

En fait, avant je faisais une boucle sur la requête mysql dans laquelle je faisais un curl faire le fichier qui récupère et traite le fichier.
En lieu et place, j'ai fais un include et le problème ne se pose plus. Le fonctionnement du script n'en reste pas moins très étrange. L'intégralité du code n'était même pas exécuté.

On lançait 6 curls et ensuite on ne faisait ni les curls suivant ni le code après la boucle.

Bref, inutile de chercher à comprendre, ça fonctionne comme ça. Merci à tous pour votre aide.

johnny57
27/01/2015, 08h28
Merci à tous pour vos réponses. Je vais essayer de répondre dans l'ordre.

@ Gaston_Phone
ça ne changerait rien de couper le fichier csv en deux puisque tous les fichiers sont appelés à la suite par un seul et même tache cron.

@Jikoo
La taille des fichiers peut être très variable. Lancer de manière arbitraire plusieurs cron avec un nb max de fichiers peut poser plusieurs problèmes.
1) si j'ai un trop gros fichier au milieu ça peut bloquer quand même
2) ça m'oblige à créer un nombre de tache cron qui peut devenir énorme à force.

Les fichiers sont toujours à jour, je demande par un autre cron la génération une heure avant chaque récupération.

Les compresser ne changera rien, c'est le temps de les parser qui est long. Un fichier peut faire plusieurs dizaines de milliers de lignes. Et ça sans parler de la taille de certaines cellules.

@Rizz
J'ai oublié de précisé, je suis en realase 3 d'ovh donc du centos si je ne me trompe pas.
Le max_execution_time est à 30

C'est possible en effet qu'on s’arrête malgré tout à la fin de temps prévu par le php.ini, je log dans mysql le début de la récup de chaques fichier et la fin. Ce matin j'ai démarré à 9:00:01 et le dernier fichier à avoir été lancé en synchro l'a été à 9:00:31 et je n'ai pas d'heure de fin dans le log mysql.

@Jikoo
Safemode est à off

Merci pour vos messages et merci d'avance pour la suite

Jikoo
26/01/2015, 18h57
Bien vu Rizz!
Un petit phpinfo() ou php.ini

max_execution_time est sur 300, par défaut.

http://php.net/manual/fr/function.set-time-limit.php
Citation Envoyé par PHP
Avertissement: Notez que set_time_limit() n'a pas d'effet lorsque PHP fonctionne en mode safe mode. Il n'y a pas d'autre solution que de changer de mode, ou de modifier la durée maximale d'exécution dans le php.ini.

Rizz
26/01/2015, 18h48
En php set_time_limit (0) est sensé redefinir le temps d'execution Jikoo et quand tu indique 0 il n'y a normalement plus aucune limite.

http://php.net/manual/fr/function.set-time-limit.php

Moi je commencerai par me renseigner sur la version Php !

Et un petit tour sur " la valeur de la directive max_execution_time définie dans le php.ini"

Et puis au final j'essaierai aussi de transmettre un temps aproximatif avant plantage car la y' 0 info en fait. Il dure combien de temps ton script avant de planter ? Est ce que ca correspond au max_execution_time du php.ini ? etc etc etc etc.

Jikoo
26/01/2015, 18h45
Si je comprends bien c'est que le script PHP s'arrête au bout d'un certain temps.
Ca c'est normal. Il y a par défaut une durée maximale d'éxécution.

Ce que tu peux faire, c'est par exemple:
Au lieu de faire une mise à jour de ta BDD avec tous les fichiers CSV, tu fais une mise à jour avec quelques fichiers CSV puis tu recommence l'opération.

Tu pourrais aussi vérifier si ton fichier CSV à été modifié depuis ta dernière visite, par exemple en comparant le hash ou la taille (en octets) du fichier. Via une requête HTML ou un Curl, ça évite ainsi de le re-télécharger inutilement.

Tu pourrais aussi compresser tes fichiers CSV avec ZIP... ou plus simplement avec zlib.
http://php.net/manual/fr/book.zlib.php
http://php.net/manual/fr/book.zip.php

Bref, voilà quelques petites idées!

Gaston_Phone
26/01/2015, 18h25
Couper le fichier csv en deux.

johnny57
26/01/2015, 18h01
Bonjour,

Je synchronise des sites entre eux en utilisant des fichiers CSV. Je lance régulièrement un script qui va aller chercher le CSV et le parser pour mettre à jour la base de données.
Problème, il commence à y avoir quelques MO à parser et je n'arrive pas à aller au bout, le script s'arrête avant.

Je passe dans le fichier un set_time_limit (0); mais quand je lance l'url dans le navigateur le serveur fini par me livrer une erreur 500.
Les logs montrent que le script avancent bien mais il manque les 2 derniers fichiers. Une idée pour m'aider à sortir du soucis ?

Merci d'avance,