Page 1 sur 1

Tag ID3 et boucles...

Posté : 21 mai 2008, 18:10
par TiTuB
Bien le bonjour !

Je suis sous XP avec PHP 5.2.6 et Apache 2.2.8.
Je vous expliques mon petit soucis.

Je fais une boucle qui parcours une arborescence à partir d'un dossier spécifié et qui mets les adresses de MP3 trouvé dans un fichier.
Un peu plus tard, je lis le fichiers pour afficher les tags de ces MP3
title - artist [album]
Ca fonctionne jusqu'à un certain point.
Au bout de quelques centaines de mp3 affiché parfaitement, voilà l'erreur qui intérromp le programme :

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 728551616 bytes) in C:\www\dev\test.php on line 50

Ce la signifie "Pas assez de RAM, mon cochon", il me semble.
Comment palier à ce problème ?

Voilà mon bout de code :
function collecter_tag($src)
{
	    $fichier = fopen($src, "r") ;
	    while (!feof($fichier))
	    {
			$ligne = fgets($fichier) ;
			$ligne = trim($ligne) ;
			$tag = id3_get_tag($ligne) ;
			echo $tag['title'].' - '.$tag['artist'].' ['.$tag['album']."]<br />\n" ;
			unset($tag) ;
	    }
}
Je tiens à préciser que cela fonctionne parfaitement jusqu'a ce que la mémoire sature (pour savoir ou chercher l'erreur)... Si quelqu'un à une idée...

Posté : 21 mai 2008, 18:13
par Calimero
Bonjour,

ça pourrait déjà aider un peu si tu fermais le fichier quand tu as fini de lire des infos dedans, c'est à dire à la fin du while(){} (voir pour cela la fonction fclose() )

Posté : 21 mai 2008, 18:16
par TiTuB
Un oubli de ma part, en effet. Je viens de corriger mais le plantage subsiste...

Posté : 21 mai 2008, 18:32
par caroube
Pourquoi ne pas utiliser la fonction file() qui lit un fichier texte dans un tableau.

Pas assez de RAM ... c'est quoi la taille du fichier que tu lis ?

Posté : 21 mai 2008, 18:36
par TiTuB
313 ko.
Et avant je ne passais pas par un fichier : dès qu'il trouvait un fichier .mp3 il extrayait et affichait le tag à l'écran. Ca plantait de la même façon...

Posté : 21 mai 2008, 18:49
par Calimero
En relisant ton code, j'ai pensé à plusieurs pistes pour économiser la (précieuse) mémoire :

- Je suis pas sûr que fgets() soit adapté pour ce que tu veux faire de la manière dont tu l'utilises (il va aller lire tout ce qu'il peut jusqu'à ce qu'il trouve un retour chariot - ce qui a du sens dans un fichier texte mais moins pour un binaire comme un mp3).
- Je ne suis pas sûr non plus que tu aies besoin de lire le fichier dans sa totalité (condition de sortie du while)
- Enfin, en dernier ressort, comme tu dis traiter plusieurs centaines de fichiers par page, je te conseille de fractionner ce traitement (par exemple en faisant plusieurs pages de résultats, plafonnés à XXX (mettons 100) par page). Cela te permettra d'éviter l'erreur tout en gagnant en performances, sachant qu'une page présentant plusieurs centaines de ligne est rarement exploitable en pratique.

Posté : 21 mai 2008, 18:54
par TiTuB
Erreur de compréhension, je me suis mal exprimé :
Dans le fichier texte, il n'y à que l'adresse du fichier ! Uniquement l'adresse, la liste de toutes les adresses. Une adresse par ligne.

Donc fgets récupere une adresse, la refile à id3_get_tag qui extrait les tags. Et ca fonctionne pendant exactement 206 mp3, après, plantage RAM...

On viens de me faire une suggestion :
206 MP3
Une moyenne de 3Mo par MP3
206 x 3Mo = 618Mo...
Il gueule parcequ'on lui réclame 700Mo de RAM...
Donc la fonction id3_get_tag doit mettre le mp3 en mémoire, extraire le tag, mais ne pas virer le mp3 de la mémoire...

Une librairie buggué...

Posté : 21 mai 2008, 22:40
par caroube
une idée pour valider ton hypothèse : évacuer tout le reste et juste faire une boucle infinie sur la lecture du tag d'un seul fichier mp3 avec id3_get_tag. Et donc normalement, au bout d'un moment, ça doit planter.

Sinon, tu peux regarder vers les bugs PHP

Autre point : la bibliothèque id3 semble être en version 0.2 alpha depuis septembre 2004. C'est donc visiblement un projet qui a été abandonné par ses auteurs. Personnellement, j'ai toujours tendance à ne pas utiliser ces projets qui semblent morts.

Quant à la lecture des tags d'un fichier mp3, il semblerait que ce soit assez facile. Cf ce code http://www.go4expert.com/forums/showthread.php?t=267