|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : avril 2010 Messages : 35 ![]() |
Bonjour à tous !
Voilà, je poste pour une petite question, qui est à l'origine un problème que j'essaie de résoudre. J'ai un script qui lit un fichier .txt afin d'en extraire des informations et de modifier une base de données : ajouter ou mettre à jour des entrées. Le fichier, globalement, ce sont des données ligne par ligne, séparées par un point-virgule. Il fait 70Mo, mais je ne pense pas que ce soit le problème. Pour certaines raisons, je dois faire une double boucle sur le même fichier. Je me demandais donc si faire deux fopen() sur le même fichier à la suite, sans fclose entre deux, avec deux variables différentes pour le $handle, pouvait faire planter le script, à cause de permissions ou de choses comme ça par exemple. Car mon script se termine, je ne sais même pas pourquoi, et pour couronner le tout je n'ai pas accès aux logs PHP (hébergement OVH mutualisé) et l'affichage des erreurs PHP sur la page (E_ALL) ne donne rien. Bref, est-ce que le script se termine à cause de ces permissions, ou est-ce un autre problème ? Voici le script, au cas où : Code :
Merci d'avance ! |
||
|
|
00
|
|
|
#2 |
![]() ![]() Gérard ErnaelstenDBA & Dev PHP Inscription : juin 2005 Messages : 3 174 ![]() |
Cela ne serais pas plus en cause la durèe du script qui dépasse 30 secondes ?
__________________
Il faut toujours viser la lune, car même en cas d'échec on arrive dans les étoiles. O.Wilde Mes Articles/Critiques : Merise - Guide pratique PHPExcel PostgreSQL : Administration et exploitation d'une base de données PostgreSQL : Entraînez-vous à créer et programmer une base de données relationnelle |
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 338 ![]() |
+1 Maitre pylos.
Ça ne serait pas possible de procéder autrement plutôt que d'ouvrir plusieurs fois le même fichier?
__________________
Stay in Bed .. Save Energy |
|
|
00
|
|
|
#4 | ||
|
Invité de passage
![]() Inscription : avril 2010 Messages : 35 ![]() |
Merci pour votre réponses !
Si, je l'ai compris après, c'est pourquoi je venais répondre à mon post Le script est arrêté par OVH car justement c'est un hébergement mutualisé. Je suis en train de reformer le script afin de n'effectuer qu'une seule boucle, mais pas facile. Pour l'instant ça marche... avec une ligne sur deux. Je sais pourquoi mais pas comment le résoudre pour le moment. Le problème est que je teste si on arrive à telle ligne (en l'occurence une ligne qui commence par ARTICLE) afin de sortir de ma boucle, mais j'ai besoin de lire cette ligne ensuite dans ma la boucle de plus haut niveau. Donc je saute une ligne sur deux. En gros il me faudrait un truc qui me permettre de remonter le pointeur de fichier d'une ligne, mais ça ne doit pas être possible de procéder ainsi... Voici le code : Code :
Merci à vous en tout cas, si j'ai la solution je la posterai.
|
||
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 338 ![]() |
Si tu precise plus le besoin général on pourra peut-être mieu t'aider.
le bout de code est une xtrait ou tu n'as besoin de récuperer que des éléments ARTMAG: Code :
if($tableau_chaine2[0] == "ARTMAG" && $tableau_chaine2[4] == "10"
__________________
Stay in Bed .. Save Energy |
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 338 ![]() |
Sinon un script plus simplifié :
Code :
__________________
Stay in Bed .. Save Energy |
||
|
|
00
|
|
|
#7 | ||
![]() ![]() Gérard ErnaelstenDBA & Dev PHP Inscription : juin 2005 Messages : 3 174 ![]() |
Et dans un premier temps si tu augmentais le temps d'attente d'un script
Code :
__________________
Il faut toujours viser la lune, car même en cas d'échec on arrive dans les étoiles. O.Wilde Mes Articles/Critiques : Merise - Guide pratique PHPExcel PostgreSQL : Administration et exploitation d'une base de données PostgreSQL : Entraînez-vous à créer et programmer une base de données relationnelle |
||
|
|
00
|
|
|
#8 | ||
|
Invité de passage
![]() Inscription : avril 2010 Messages : 35 ![]() |
En gros le fichier se présente comme ça :
Code :
Je ne m'intéresse qu'au magasin 10. Avant la moulinette cherchait une ligne ARTMAG donc le code magasin était 10, et refaisait une boucle pour trouver la ligne ARTICLE identifiée par son code article (les données marquées par des XXX;XX;XXX). J'ai modifié ce script pour permettre de ne faire qu'une seule boucle, donc maintenant je recherche d'abord la ligne ARTICLE, et j'exécute le code seulement si la ligne ARTMAG avec le numéro 10 suit (comme dans l'exemple ci-dessus). Le problème est que ma boucle permettant de rechercher cette ligne ARTMAG s'arrête quand elle trouve une ligne ARTICLE (l'article suivant). Donc je reviens dans une boucle de plus haut niveau (celle qui cherche les lignes ARTICLE). Le truc c'est que comme le pointeur a déjà passé la ligne article (à cause du while de plus bas niveau), je loupe un article sur deux. Voilà pour les explications :p J'ai volontairement mis les données en "XXX" ou "..." car je ne sais pas si j'ai le droit de divulguer ça. Bref, ça ne pose pas de problème de toute manière. Merci ! ![]() Edit : bon j'ai l'air d'avoir trouvé. Sauf qu'apparemment le script est toujours trop long et dépasse les 30 secondes. 70Mo le fichier texte quand même ! Je dois lire toutes les lignes. Je ne sais pas trop comment faire... Je pense qu'en attendant je vais rapatrier la base de données sur mon ordinateur, la mettre à jour et réimporter la base, je ne vois que ça. |
||
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 338 ![]() |
donc mon code devrais te convenir
__________________
Stay in Bed .. Save Energy |
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Inscription : avril 2010 Messages : 35 ![]() |
@Maître Pylos : j'ajoute ton code et je teste, mais il me semble que chez OVH ça ne fait rien. Je tente quand même.
@Boo64 : A première vue, ton code ne lie pas ARTICLE et ARTMAG, si ? Ce que je veux faire, c'est, si une ligne ARTMAG avec le code magasin 10 existe, alors je vais rechercher la ligne ARTICLE correspondante (via le code article en trois parties commun aux deux lignes ARTMAG et ARTICLE) afin de récupérer les informations comme la description, le prix, etc... Merci à vous deux en tout cas, c'est sympa de m'aider. ![]() edit : ah non je vois ce que tu veux dire Boo ! Je teste ça de suite
|
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Inscription : avril 2010 Messages : 35 ![]() |
Bon ben j'ai testé le script, il fonctionne (avec quelques adaptations car tu n'as pas pu tester de ton côté donc c'est normal
Je pense que lire le fichier ligne par ligne n'est donc pas la bonne solution, on a fait le tour des manières de coder ce truc ! Je pense me pencher vers une migration de la base vers ma machine locale, sa mise à jour, puis une restauration de la base en ligne. Ceci dit, c'est pas très automatisé, mais la mise à jour n'a lieu que deux fois par ans. C'est ça ou prendre un dédié chez OVH, AMHA. Qu'en pensez-vous ? |
|
|
00
|
|
|
#12 | |||
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 338 ![]() |
Citation:
http://travaux.ovh.net/?do=details&id=5332
__________________
Stay in Bed .. Save Energy |
|||
|
|
00
|
|
|
#13 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
tu devrais faire ca en 2 temps
- traiter le CSV (et le mettre tout ca dans un nouveau CSV) - inséré le nouveau CSV sinon t'as mysqli ou PDO ? même sans avoir les 2 tu peux toujours faire une requête préparée qui sera dans ton cas plus efficace EDIT : quelque chose dans le style https://gist.github.com/944414
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() Inscription : avril 2010 Messages : 35 ![]() |
Salut,
Finalement, il semble que depuis le logiciel qui exporte ce gros fichier on puisse sélectionner ce qu'il faut importer. Car dans ce fichier de 70 Mo, 75% des lignes ne me servent pas, mais sont quand même lues par le script. La base de données a été mise à jour pour finir (je suis passé par le local, en attendant). Je vais tout de même étudier ton script stealth. Merci bien ! |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com