[PHP] traiter des fichiers de 40 Mo !!

traiter des fichiers de 40 Mo !! [PHP] - PHP - Programmation

Marsh Posté le 24-11-2003 à 13:07:43    

:hello:  
j'essaie de faire un script d'analyse des fichiers logs du proxy (parcours du fichier ligne par ligne et insertion des champs qui m'interessent dans la db), mais problème les fichiers font en moyenne 40 megas :/
 
j'arrive à inserrer env. 24000 enregistrements dans ma table puis tt à coup j'ai cette erreur :
"You have an error in your SQL syntax near '%20ord2%20+%20'?')' at line 1"  or c'est la meme requete qui est executee tt le temps et les 24000 1eres fois elle est executee sans problèmes... :heink:  

$sql="insert into proxy values ('','$date','$info[0]','$user','$info[5]','$moout','$moin','$info[15]','$info[18]')";
mysql_query($sql) or die(mysql_error());


 
 
quelqun a une technique pour traiter de tels fichiers ??
Merci.

Reply

Marsh Posté le 24-11-2003 à 13:07:43   

Reply

Marsh Posté le 24-11-2003 à 13:14:55    

j en sais rien !

Reply

Marsh Posté le 24-11-2003 à 13:18:26    

pour info : %20 c'est un espace

Reply

Marsh Posté le 24-11-2003 à 13:25:33    

t'as une guillement qui traine:

kayasax a écrit :

...
"You have an error in your SQL syntax near '%20ord2%20+%20'?')' at line 1"  

Reply

Marsh Posté le 24-11-2003 à 13:53:38    

wai en fait ta recuperer la base de quelque part et tu cherche a l'uploader autre part. c'est ca?
 
On pourrait se dire que la syntax est parfaite mais dans l'enregistrement du .sql j'avais des erreur comme la tienne.
A ce demander comment ca peu arriver :/

Reply

Marsh Posté le 24-11-2003 à 13:56:44    

chacal_one333 a écrit :

On pourrait se dire que la syntax est parfaite mais dans l'enregistrement du .sql j'avais des erreur comme la tienne.
A ce demander comment ca peu arriver :/

J'ai déjà eu le même tour..PHPMyAdmin de merde ? MySQL de merde ?  [:spamafote] (Enfin, pour le dernier j'vois pas pkoi j'ai mis un ? :D)

Reply

Marsh Posté le 24-11-2003 à 14:05:51    

Pour vérifier que le problème ne vient pas de certaines lignes de log qui contiennent des valeurs rendant la requête MySQL incorrecte, arrange toi pour logguer en cas d'erreur de la requête la ligne de log incriminée et la requête correspondante.
Ignore l'erreur et passe à la ligne de log suivante, ça te donnera toutes les lignes "foireuses" du log analysé et te permettra sans doute d'y voir plus clair.


---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 24-11-2003 à 14:11:06    

Merci de m'avoir lu ...

JagStang a écrit :

pour info : %20 c'est un espace


oui merci je suis pas completement debile ...
 
 
Anapajari : "t'as une guillement qui traine": Ce n'est pas moi qui ai ecrit cette requete je ne sais pas d'ou elle sort ...
 
"wai en fait ta recuperer la base de quelque part et tu cherche a l'uploader autre part. c'est ca? " pas du tout comme dis plus haut je parcours un fichier et insere certains element dans une bdd.
 
 
le code :


<?
$date="031121";
$filename="W3";
$filename.=$date;
$filename.=".log";
$con=mysql_connect('localhost','root','');
$db=mysql_select_db('proxy',$con);
 
$fp = fopen ($filename, "r" );
while (!feof ($fp)) {
    $buffer = fgets($fp, 4096);
    $info=explode(",",$buffer);
   
    $user=ereg_replace("INTRASMAC","",$info[1]);
    $moout=round(($info[13]/1024/1024),3);
    $moin=round(($info[14]/1024/1024),3);
    $sql="insert into proxy values ('','$date','$info[0]','$user','$info[5]','$moout','$moin','$info[15]','$info[18]')";
    mysql_query($sql) or die(mysql_error());
 
 if($a%100 ==0) echo " * ";
}
fclose ($fp);
echo'FIN'
?>


 
 
La structure de la table :
 
Champ Type Null Défaut  
id   int(10)  Non    
date   date Non  0000-00-00  
ip   varchar(15) Non    
user   varchar(100) Non    
heure   time Non  00:00:00  
moout   float Non  0  
moin   float Non  0  
proto   varchar(10) Non    
uri   varchar(250) Non    
 

Reply

Marsh Posté le 24-11-2003 à 14:36:14    

utilise plutôt un bulk insert (plusieurs lignes à la fois) ça sera vachement moins lourd pour le serveur
 
INSERT INTO matable VALUES ('ligne1'),('ligne2'),('ligne3')
 
et tu fais une insertion par paquet de 1000 par exemple


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 24-11-2003 à 14:36:51    

KrisCool a écrit :

Pour vérifier que le problème ne vient pas de certaines lignes de log qui contiennent des valeurs rendant la requête MySQL incorrecte, arrange toi pour logguer en cas d'erreur de la requête la ligne de log incriminée et la requête correspondante.
Ignore l'erreur et passe à la ligne de log suivante, ça te donnera toutes les lignes "foireuses" du log analysé et te permettra sans doute d'y voir plus clair.


 
Merci c'est bien certaines lignes qui posent pb, peut etre mon champs uri n'est pas assez long, je le modifie et resteste...

Reply

Marsh Posté le 24-11-2003 à 14:36:51   

Reply

Marsh Posté le 24-11-2003 à 14:42:28    

mais non dans certains champs tu dois avoir un guillemet... Et comme tu fais aucun traitement dessus bin ça pète.
Commence par faire un addslashes( http://dev.nexen.net/docs/php/anno [...] n=addslash ) sur tous les champs varchar
Ensuite vérifier la longueur des champs que tu inseres est également une bonne idée
[edit: je sais pas pourquoi j'ecris guillement en ce moment au lieu de guillemet]


Message édité par anapajari le 24-11-2003 à 14:43:57
Reply

Marsh Posté le 24-11-2003 à 14:49:15    

ok merci c'est juste ce à quoi je venais de penser (suis je bete !) ca a l'air de tourner now

Reply

Marsh Posté le 24-11-2003 à 15:27:18    

finalement ca va relativement vite pour inserer env. 142000 lignes

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed