misterzinzin
Messages postés112Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention26 janvier 2011
-
2 juin 2007 à 18:29
misterzinzin
Messages postés112Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention26 janvier 2011
-
3 juin 2007 à 11:17
bonjour,
je viens d'essayer d'insérer un fichier dans un longblob avec mi-succes.
je dis ca car les petit fichier < à la taille d'un mp3 passe mais un mp3 (3mo ou plus) ne passe pas...
function ajouteFichier($infoFichier,$description)
{
if($infoFichier['tmp_name']=='') erreur('fichier introuvable');
$db = mysql_connect("localhost","root","...")
or erreur("erreur de connexion à la base de donnée");
if($db!=0)
{
mysql_select_db("forum",$db) or erreur(mysql_error()) ;
$requete = "insert into fichiers(id_user,description,nom,type,taille,fichier) values ('".
addslashes($_SESSION['id_login'])."','".
addslashes($description)."','".
addslashes($infoFichier['name'])."','".
addslashes($infoFichier['type'])."','".
addslashes($infoFichier['size'])."','".
addslashes(fread(fopen($infoFichier['tmp_name'],"rb"),filesize($infoFichier['tmp_name'])))."')";
mysql_query ($requete,$db) or erreur(mysql_error()) ;
mysql_close($db);
}
}
evidemment, comme on le voit, tout le fichier est passé dans une grosse requete.
y a-t-il moyen de passer le fichier dans plusieur requete ou alors une autre technique ?
en tout cas moi je dois avouer que je ne connais rien d'autre :-(
pouvez vous m'aider ?
misterzinzin
Messages postés112Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention26 janvier 20112 3 juin 2007 à 11:17
donc en résume:
pour utiliser plainement les blob de mysql:
modifier php.ini (chercher les variables et les modifier)
post_max_size = 200M
upload_max_filesize = 200M
puis redémarrer apache.
ensuite: exécuter la requete sql suivante
SET GLOBAL max_allowed_packet=200000000
en principe: replacer GLOBAL par SESSION et exécuter juste après la requete d'ajout de fichier serait plus raisonable.
pour les test j'ai utilisé movamp sous windows xp sp2
j'imagine que sous linux le principe reste le meme.
donc maintenant que j'y pense, le probleme se situe avant d'envoyer vers la base de donnée.
donc je supose qu'il y à une limite au niveau du serveur web (apache)
misterzinzin
Messages postés112Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention26 janvier 20112 3 juin 2007 à 10:31
oui effectivement, en modifiant la ligne
upload_max_filesize = 2M
par
upload_max_filesize = 200M
le fichier est apparement bien uploadé
maintenant, c'est au niveau de mysql que ca coince
mysql_error() me retourne ceci:
MySQL server has gone away
que veut dire ce message ?
moi, le seul, l'unique, ZinZin [:I]
Vous n’avez pas trouvé la réponse que vous recherchez ?
misterzinzin
Messages postés112Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention26 janvier 20112 3 juin 2007 à 10:56
apparement, ca vient de la requete sql qui est trop grande.
en effet, si on exécute (dans phpmyadmin par exemple)
SHOWVARIABLES
on recupere toute une série de variable dont:
max_allowed_packet 1047552
il faut donc changer cette variable avant d'envoyer une grosse requete:
SET GLOBAL max_allowed_packet=200000000
et maintenant ca marche.
donc en résumé, il faut modifier le fichier php.ini:
upload_max_filesize = 200M
puis après avoir redémarré le serveur (ou autre manipulation permettant de faire relire le fichier de config)
exécuter la requete sql suivante
SET GLOBAL max_allowed_packet=200000000
(oui bon... ca ne fait pas vraiment 200 MO mais bon...)
remarque: il y à surement moyen de le faire directement en passant par le fichier de config de mysql mais je ne l'ai pas touvé.
donc maintenant ca passe très bien avec un fichier mp3
Cristina Aguilera - Hurt.mp3, audio/mpeg, 5552128, [BLOB - 5,3 Mio], 2007-06-03 10:48:12
mais... pas avec un fichier de 75Mo
donc il doit y avoir une autre limitation (apache ?)
misterzinzin
Messages postés112Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention26 janvier 20112 3 juin 2007 à 11:11
j'avais oublié de modifier
post_max_size = 8M
par
post_max_size = 200M
évolution de l'histoire:
avant, avec mon fichier de 75Mo je n'avais pas d'erreur mais ca ne marchais pas
maintenant, ca marche.
cependant, en regardant l'évolution de la mémoire ram... ca fait assez peur.
en fait tout le fichier est stocké en ram et donc pour un pc qui est en général à 900Mo de ram utilisé, j'ai eu des pointe jusqu'a 1,2Go lors de l'upload de mon fichier.
donc 300Mo pour un fichier de 75Mo
mon hypothése:
75*2 (pour le addslashes)=150Mo en cache de apache (ou php?)+les 150Mo du fichié transféré en mémoire vers mysql
mais on... ca marche.
je pense que je n'atteindrait jamais la limite d'un longblob (4Go)...