Afficher une barre de progression dans bouche

Eléphanteau du PHP | 18 Messages

29 déc. 2005, 23:42

Bonjour,

J'ai écrit un script qui analyse dans une boucle plusieurs dizaines de milliers de lignes et pour chaque ligne appelle des fonctions; tout ça sans rien envoyer au navigateur, sauf s'il découvre une ereur dans les lignes.

Tout ça prend du temps et j'arrive à excéder le time out du serveur. Dans ma boucle, j'ai donc demandé à afficher un point toutes les 1000 passages dans la boucle.

Mais, ces points ne s'affichent qu'un fois tout terminé et de plus , si une erreur a été détectée, les points ne sont plus à la queue leu leu mais sur différentes lignes séparées par des affichages des erreurs détectées.

COmment pourrais-je résoudre mes problèmes ?
Afficher au fur et à mesure, afficher la progression indépendemment de l'affichage des erreurs ?

Cordialement,

ViPHP
ViPHP | 1380 Messages

30 déc. 2005, 09:28

Bonjour,

Il faut travailler avec les fonctions de bufférisation

Un exemple qui marche sur FF et IE:
$texte = '=';

// hack pour IE
$texte = strlen($texte) > 10 ? $texte : str_pad($texte, 10);

for ($i = 0; $i <= 5; $i++){
  sleep(1);  // pour simuler l'exécution de ton code
  echo $texte;
  flush();
}
ripat

Eléphanteau du PHP | 18 Messages

30 déc. 2005, 10:10

Merci,
Mais j'avais déjà travaillé là-dessus.... flush() ne donne rien.
J'ai rajouté une mesure du temps d'exécution du script avec microtime() pour voir combien de temps prenait le script. j'ai environ 80 s ....

Rien ne s'affiche avant la fin de l'exécution du script. J'ai même forcé une erreur sur la 1ère ligne pour qu'elle soit affiché dés le début de l'exécution.
Ca affiche sur FF mais rien sur IE.

Idem pour ma barre.

???

ViPHP
ViPHP | 1380 Messages

30 déc. 2005, 10:39

...voir combien de temps prenait le script. j'ai environ 80 s ....
80 secondes, ben mon vieux quel script! (ou quel serveur!) :wink:

Pistes:
  • optimiser ton script, mais ça je suppose que c'est fait!
  • faire tourner le script en background voir ce post
Rien ne s'affiche avant la fin de l'exécution du script. J'ai même forcé une erreur sur la 1ère ligne pour qu'elle soit affiché dés le début de l'exécution.
Ca affiche sur FF mais rien sur IE.
J'ai le souvenir d'avoir eu le même problème. Après recherches sur le net j'ai trouvé que IE n'affiche les flush() que si il y a un minimum de caractères. D'où mon hack plus haut. Essaye d'augmenter le nombre d'espaces insérés dans str_pad().
ripat

Eléphanteau du PHP | 18 Messages

30 déc. 2005, 11:08

Merci pour tes conseils...
Je cerne mieux le problème maintenant et après pas mal de recherches sur le Web, il semble évident que le problème n'est pas simple !
Il dépend d'une part du navigateur FF et IE ne réagissent pas du tout pareil, et d'autre part du serveur suivant l'OS et le serveur Web et leur paramétrage....

Bref, pas évident !!

Les flush() et compagnie ne fonctionnent pas dans mon cas.

Quant au 80-90 s pris par le script... Je sais pas trop s'il est optimisé. J'ai fait une boucle qui lit une ligne dans un fichier avec fgets() et qui appelle ensuite une fonction qui analyse le contenu du buffer et en extrait les infos que j'ai besoin, puis le contenu alimente une requête MySQL qui sauve le contenu dans la base., et ainsi de suite.
Le fichier que je traite actuellement a plus de 55000 lignes..

Ce qui est sûr, c'est que FREE chez qui je suis hébergé est actuellement TRES lent depuis une quinzaine de jours...

Je parle pas de leur SAV !! J'ai signalé la panne de ma FreeBox il y a 4 semaines, et malgré mes appels et mails, rien ne bouge !!! Quelle merde !

Heureusement que j'avais un vieux modem ADSL et que je m'y connais un peu, sinon je n'aurais même pas d'internet !

Merci,

ViPHP
ViPHP | 1380 Messages

30 déc. 2005, 12:57

Quant au 80-90 s pris par le script... Je sais pas trop s'il est optimisé. J'ai fait une boucle qui lit une ligne dans un fichier avec fgets() et qui appelle ensuite une fonction qui analyse le contenu du buffer et en extrait les infos que j'ai besoin, puis le contenu alimente une requête MySQL qui sauve le contenu dans la base., et ainsi de suite.
Le fichier que je traite actuellement a plus de 55000 lignes..
Tu ne fais quand même pas 55000 requêtes MySQL en boucle? :afraid:

Si c'est le cas, il y a certainement moyen d'optimiser. A voir également comment tu captures l'info du fichier.

Il y a moyen de planter un server avec tout ça! :wink:

Si tu veux on jette un coup d'oeil sur ce script et on t'aide à optimiser.
ripat

Eléphanteau du PHP | 18 Messages

30 déc. 2005, 13:04

Ben si, je fais 55000 update dans la base... je sais pas si en stockant tout et en faisant une seule requête, ce serait vraiment plus rapide ?

Mais tu as surement raison, il y a moyen d'optimiser... je ne suis pas un expert !
passes moi ton mail, je t'envoie les scripts si tu as le temps d'y jeter un oeil.

le mien [email protected]

merci pour ta sollicitude,

ViPHP
ViPHP | 1380 Messages

30 déc. 2005, 13:39

L'esprit de ce forum est de tout déballer en public afin que tout le monde en profite! :wink:

Alors, pour une mise à jour massive d'une table, deux conseils:
  • le mieux est d'injecter par LOAD DATA INFILE beaucoup plus rapide que des INSERT successifs (si possible)
  • supprimer les index éventuels (DROP) et les recréer après la mise à jour
ripat

Eléphanteau du PHP | 18 Messages

30 déc. 2005, 15:47

Merci pour les conseils, pas de problème pour tout déballer. C'était pour pas encombrer...
Voici donc le script qui correspond à mon problème, achtung c'est un peu long (c'est aussi pour ça que je voulais l'envoyer en privé)
merci d'avance poru vos conseils,

--------------------------------------------------
// get language
if (!isset($_GET['lang']))
	{ 	include "en.php";
		$lang="en";
	}
else
	{ 	include $_GET['lang'].".php";
		$lang=explode (".",$_GET['lang']);
		$lang=$lang[0];
	}
		
// make a connection to database
include "connectdb.php";

// init some variables
$NbQso=0;
$dateday=date("Y-m-d");

// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// | function adif2qsl
// | to extract fields from a valid ADIF line and insert it in the MySQL database
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
function adif2sql ($string)

{ // start of function adif2sql	

// setting function variables
global $NbQso;
global $error;
$error="";

$string=strtoupper($string);

// to limit the number of lines to be read
// line must at least be not empty and have and end of record tag + CALL field
// if an important field is missing, we set a flag , so we do not import the QSO and display the line as error
if ( $string != "\n" && $string != "\r\n" && stristr($string, "<CALL:") && stristr($string,"<EOR>"))
{
	// extracting date if found
	// 2 formats possible
	// else there is a problem
	if ($x = stristr($string,"<QSO_DATE:8:D>"))
			{	//eregi ("<QSO_DATE:([0-9]+):([A-Z]+)>([0-9]+)",$x,$regs);
				//list($null,$length,$type,$adifdate)=$regs;
				//$adifdate=substr($adifdate,0,$length);
				
				$x = sscanf ($x, "<QSO_DATE:8:D>%s ",$adifdate);
				$adifdate = substr($adifdate,0,8);
				$date=substr($adifdate,0,4)."-".substr($adifdate,4,2)."-".substr($adifdate,6,2);
			}
	elseif	($x = stristr($string,"<QSO_DATE:8>"))
			{	$x = sscanf ($x, "<QSO_DATE:8>%s ",$adifdate);
				$adifdate = substr($adifdate,0,8);
				$date=substr($adifdate,0,4)."-".substr($adifdate,4,2)."-".substr($adifdate,6,2);
			}
	else	{$error="NO DATE HEADER";}		
			
	// Extract time is found
	// 4 formats possible
	// else there is a problem
	if ($x = stristr($string,"<TIME_ON:6>"))
			{	$x = sscanf ($x, "<TIME_ON:6>%s ",$adiftime);
				$adiftime = substr($adiftime,0,6);
				$time=substr($adiftime,0,2).":".substr($adiftime,2,2).":".substr($adiftime,4,2);
			}
	elseif ($x = stristr($string,"<TIME_ON:4>"))
			{	$x = sscanf ($x, "<TIME_ON:4>%s ",$adiftime);
				$adiftime = substr($adiftime,0,4);
				$time=substr($adiftime,0,2).":".substr($adiftime,2,2).":00";
			}
	elseif ($x = stristr($string,"<TIME_ON:6:T>"))
			{	$x = sscanf ($x, "<TIME_ON:6:T>%s",$adiftime);
				$adiftime = substr($adiftime,0,6);
				$time=substr($adiftime,0,2).":".substr($adiftime,2,2).":".substr($adiftime,4,2);
			}
	elseif ($x = stristr($string,"<TIME_ON:4:T>"))
			{	$x = sscanf ($x, "<TIME_ON:4:T>%s",$adiftime);
				$adiftime = substr($adiftime,0,4);
				$time=substr($adiftime,0,2).":".substr($adiftime,2,2).":00";
			}			
	else	{$error="NO TIME HEADER";}				
	
	// extracting callsign if found
	// else there is a problem
	if ($x = stristr($string,"<CALL"))
			{	$x = sscanf ($x, "<CALL:%d>%s ",$length,$adifcall);
				$callsign = substr($adifcall,0,$length);
			}
	
	// extracting mode if found
	// else there is a problem
	if ($x = stristr($string,"<MODE"))
			{	$x =	sscanf ($x, "<MODE:%d>%s ",$length,$adifmode);
				$mode = substr ($adifmode,0,$length);
			}
	else	{$error="NO MODE HEADER";}		
	
	// Extracting BAND if present
	// if not check is FREQ is present
	// if not, then there is a problem
	if ($x = stristr($string,"<BAND"))
			{	$x = sscanf ($x, "<BAND:%d>%s ",$length,$adifband);
				$band = substr($adifband,0,$length);
			}
	elseif ($x = stristr($string,"<FREQ"))
			{	$x = sscanf ($x, "<FREQ:%d>%s ",$length,$adifreq);
				$freq = substr($adifreq,0,$length);
				
				// case 1800-2000
				if (ereg('^1.8',$freq))		{ $band = "160M"; }
				// case 3.5-3.8
				elseif (ereg('^3',$freq))   { $band = "80M";	}
				// case 7.0-7.2
				elseif (ereg('^7',$freq))	{ $band = "40M";	}
				// case 10
				elseif (ereg('^10',$freq))	{ $band = "30M";	}
				// case 14-14.350
				elseif (ereg('^14',$freq))	{ $band = "20M";	}
				// case 18
				elseif (ereg('^18',$freq))	{ $band = "17M";	}
				// case 21-21.4
				elseif (ereg('^21',$freq)) 	{ $band = "15M";	}
				// case 24
				elseif (ereg('^24',$freq))	{ $band = "12M";	}
				// case 28-29.7
				elseif (ereg('^28',$freq))	{ $band = "10M";	}
				// case 144-148
				elseif (ereg('^144',$freq))	{ $band = "2M";	}
			}
	else			
			{	$error="NO BAND HEADER";
			}
			
	// Extracting QSL received
	// if QSL_RCVD field found, than extract data
	// if not we assume no QSL was received
	if ($x = stristr($string,"<QSL_RCVD"))
			{	$x = sscanf ($x, "<QSL_RCVD:%d>%s ",$length,$qslrcvd);
				$qsl_rcvd = substr($qslrcvd,0,$length);
			}
	else
			{ $qsl_rcvd="N"; }
	
	// Extracting QSL sent
	// if QSL_SENT field found, than extract data
	// if not we assume no QSL was SENT
	if ($x = stristr($string,"<QSL_SENT"))
			{	$x = sscanf ($x, "<QSL_SENT:%d>%s ",$length,$qslsent);
				$qsl_sent = substr($qslsent,0,$length);
			}
	else
			{$qsl_sent="N";}
			
	// Extracting rst received when field is found
	// else there is a problem
	if ($x = stristr($string,"<RST_RCVD"))
			{	$x = sscanf ($x, "<RST_RCVD:%d>%s ",$length,$rstrcvd);
				$rst_rcvd = substr($rstrcvd,0,$length);
			}
	else	{$error="NO RST_RCVD HEADER";}		
							
	// Extracting rst received if found
	// else there is a problem
	if ($x = stristr($string,"<RST_SENT"))
			{	$x = sscanf ($x, "<RST_SENT:%d>%s ",$length,$rstsent);
				$rst_sent = substr($rstsent,0,$length);
			}
	else	{$error="NO RST_SENT HEADER";}	
	
	// extracting QSLSDATE
	// 2 formats possible
	// not critical so no error generated
	if ($x = stristr($string,"<QSLSDATE:8>"))
			{	$x = sscanf ($x, "<QSLSDATE:8>%s",$adifdate);
				$adifdate = substr($adifdate,0,8);
				$qslsdate=substr($adifdate,0,4)."-".substr($adifdate,4,2)."-".substr($adifdate,6,2);
			}
	elseif	($x = stristr($string,"<QSLSDATE:8:D>"))
			{	$x = sscanf ($x, "<QSLSDATE:8:D>%s ",$adifdate);
				$adifdate = substr($adifdate,0,8);
				$qslsdate=substr($adifdate,0,4)."-".substr($adifdate,4,2)."-".substr($adifdate,6,2);
			}
	
	// extracting QSLRDATE
	// 2 formats possible
	// not critical so no error generated
	if ($x = stristr($string,"<QSLRDATE:8:D>"))
			{	$x = sscanf ($x, "<QSLRDATE:8:D>%s ",$adifdate);
				$adifdate = substr($adifdate,0,8);
				$qslrdate=substr($adifdate,0,4)."-".substr($adifdate,4,2)."-".substr($adifdate,6,2);
			}
	elseif	($x = stristr($string,"<QSLRDATE:8>"))
			{	$x = sscanf ($x, "<QSLRDATE:8>%s ",$adifdate);
				$adifdate = substr($adifdate,0,8);
				$qslrdate=substr($adifdate,0,4)."-".substr($adifdate,4,2)."-".substr($adifdate,6,2);
			}
		
	// uncomment for displaying result for test
	// echo $NbQso." ".$date." ".$time." ".$callsign." ".$band." ".$mode." ".$rst_rcvd." ".$rst_sent." ".$qsl_rcvd." ".$qsl_sent."<BR>";
		
	// if no errors found we save the QSO in the MySQL database and increment the number of  valid QSO found
	if ($error == "")
		{	// build MySQL query and execute
			$query = "INSERT INTO log_".$_GET['logname']." SET date='".$date."', time='".$time."', callsign='".$callsign."', band='".$band."', mode='".$mode."', qsl_rcvd='".$qsl_rcvd."', qsl_sent='".$qsl_sent."', rst_rcvd='".$rst_rcvd."', rst_sent='".$rst_sent."', date_sent='".$qslsdate."', date_rcvd='".$qslrdate."'";
			$query=mysql_query($query) or die (mysql_error());
			
			// increment number of QSO found in file
			$NbQso++;
		}
}
} // end of function adif2sql ***********************
	
// +++++++++++++++++++++++++++
// | start of main program
// +++++++++++++++++++++++++++
echo "<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
			<html>
			<head>
			<meta content='text/html; charset=ISO-8859-1' http-equiv='content-type'>
			<title>Logbook Admin page</title>
			<link href='weblog.css' rel='stylesheet' type='text/css'>
			</head>
			
			<body background='weblog_bg.jpg'>
			<br>
			<div align='center'><img src='weblog_title.jpg'><br></div>";
			
if ( !isset($_GET['logname']) || $_GET['logname'] == "" )
	{	die($nocallset); }
else 
	{	$adifile=$_GET['logname'].".ADI";
		
		$startTime = array_sum(explode(" ",microtime()));  // start calculation of ellapsed time

// check if this file is an ADIF file
// by looking for <EOR> or <CALL: in first 20 lines, if not found it is certainly not an ADIF file
$fh = fopen($adifile, 'r') or die($filenotfound);
$i=0;
while ( $i<=20 )
	{	$buffer=fgets($fh);
		if (stristr($buffer, "<CALL:") && stristr($buffer,"<EOR>")) { $ValidAdifFile=1; }
		$i++;
	}
fclose($fh);

if ( $ValidAdifFile==1 )   // if it's a valid ADIF file then proceed
{
		echo "			
			<table border='0' cellspacing='0' cellpadding='0' class='medium' align='center'>
			<tr><td  class='medium' colspan='2'>".$startconv1.$adifile.$startconv2.$_GET['logname']."</td></tr>
			<tr><td height='10' bgcolor='#ffffff' colspan='2'><img src='null.gif' width='1' height='10'></td></tr>
			<tr><td class='medium' colspan='2'>".$psewait."</td></tr>
			<tr><td height='10' bgcolor='' colspan='2'><img src='null.gif' width='1' height='10'></td></tr>";
		
			// open log file
			$fh = fopen($adifile, 'r') or die($filenotfound);
	
			// read every line until end of file and proceed conversion
			while ( !feof ($fh) )
			{
				$buffer=fgets($fh); // read line by line
				adif2sql($buffer); 	// call function to convert to MySQL
				if ($error != "") 	// display errors
					{ 	echo "<tr><td class='medium'><font color='red'>".$error."&nbsp;</font></td><td>".$buffer."</td></tr>";
						$Nberror++;
					}
				// update date in database
				$query="UPDATE `log_callsigns` SET `updated` = '".$dateday."' WHERE `callsign`='".$_GET['logname']."' LIMIT 1" ;
				$result=mysql_query($query) or die (mysql_error());
				
									
				if ($NbQso % 500 == 0)
					{
						ob_start();
						//$bar = strlen($bar) > 10 ? $bar : str_pad($bar, 10);
						echo "|";
						//echo "<tr><td>".$bar."</td></tr>";
						ob_end_flush();
					
					}
				
			}
}
else
	// it's not an ADIF file
	{ echo "<tr class='medium'><td>".$warningnotadif."</td></tr>";
	}	
}

// displaying result
echo "<tr><td height='10' bgcolor='#ffffff' colspan='2'><img src='null.gif' width='1' height='10'></td></tr>";
echo "<tr class='medium'><td colspan='2'>".$NbQso.$convertdone.$txt_but.$Nberror.$errors."</td></tr>";
echo "<tr><td height='10' bgcolor='#ffffff' colspan='2'><img src='null.gif' width='1' height='10'></td></tr>";
echo "<tr class='medium'><td colspan='2'>".$computetime.round((array_sum(explode(' ',microtime())) - $startTime),4)." sec</td></tr>";
echo "<tr><td height='10' bgcolor='#ffffff' colspan='2'><img src='null.gif' width='1' height='10'></td></tr>";
echo"<tr class='medium'><td colspan='2'><a href='admin.php?lang=".$lang."'>".$back2admin."</a></td></tr>
</table>
</body>
</html>";

// close database and file
mysql_close ($connection);
fclose($fh);

ViPHP
ViPHP | 1380 Messages

30 déc. 2005, 16:03

A première vue il lit effectivement chaque ligne d'un fichier, la parse et la formate pour ensuite l'insérer.

Pour le parsing, je ne connais pas trop sscanf() mais par contre ce script utilise ereg(). Pas terrible au niveau des perf!

As-tu besoin de toutes les infos du fichier?

Si ce n'est pas confidentiel, pourrais-tu donner:
  • un extrait d'un fichier à parser (ou l'url où il est disponible)
  • ce qui t'intéresse
  • la structure de la table MySQL.
ripat

Eléphanteau du PHP | 18 Messages

30 déc. 2005, 16:18

J'ai effectivement besoin de tout ce que j'extrais. Les lignes que j'analyse ont beaucoup plus d'infos et peuvent avoir différentes structures. iL faut donc que j'analyse tous les cas.

Pour eregi, il y a un endroit où j'ai remplacé eregi par sscanf, et je n'ai pas vu de différence...

Plus loin, il y a une série de ereg() , mais c'est une partie qui dans mon cas ne sert pas, le champ n'étant pas présent dans mon fichier et ce n'est donc pas ce qui doit ralentir l'exécution du script.

Rien de secret dans quoi que ce soit, j'ai commenté en anglais au cas où je diffuserais mes scripts. (one never knows !)

voilà donc un extrait de quelques lignes et la structure de la table.

CREATE TABLE `tk5ep`.`test` (
`date` date NOT NULL default '0000-00-00',
`time` time NOT NULL default '00:00:00',
`callsign` varchar( 12 ) COLLATE latin1_general_ci NOT NULL default '',
`band` varchar( 5 ) COLLATE latin1_general_ci NOT NULL default '',
`mode` varchar( 5 ) COLLATE latin1_general_ci NOT NULL default '',
`rst_sent` char( 3 ) COLLATE latin1_general_ci NOT NULL default '',
`rst_rcvd` char( 3 ) COLLATE latin1_general_ci NOT NULL default '',
`qsl_sent` char( 1 ) COLLATE latin1_general_ci NOT NULL default 'N',
`date_sent` date NOT NULL default '0000-00-00',
`qsl_rcvd` char( 1 ) COLLATE latin1_general_ci NOT NULL default 'N',
`date_rcvd` date NOT NULL default '0000-00-00',
KEY `callsign` ( `callsign` )
) ENGINE = MYISAM DEFAULT CHARSET = latin1 COLLATE = latin1_general_ci;

---------------------------------------

<BAND:3>80M <CALL:8>F6KQW/39 <CONT:2>EU <CQZ:2>14 <DXCC:3>227 <ITUZ:2>27 <MODE:2>CW <OPERATOR:5>TK5EP <QSL_RCVD:1>Y <QSL_SENT:1>Y <QSLSDATE:8>19940129 <QSO_DATE:8:D>19940129 <RST_RCVD:3>599 <RST_SENT:3>599 <TIME_ON:6>060600 <TIME_OFF:6>060600 <APP_LOGGER32_QSO_NUMBER:1>7 <EOR>

<BAND:3>80M <CALL:8>F6BDM/59 <CONT:2>EU <CQZ:2>14 <DXCC:3>227 <ITUZ:2>27 <MODE:2>CW <OPERATOR:5>TK5EP <QSL_RCVD:1>Y <QSL_SENT:1>Y <QSLSDATE:8>19940129 <QSO_DATE:8:D>19940129 <RST_RCVD:3>599 <RST_SENT:3>599 <TIME_ON:6>060800 <TIME_OFF:6>060800 <APP_LOGGER32_QSO_NUMBER:1>8 <EOR>

<BAND:3>80M <CALL:8>F5JNT/30 <CONT:2>EU <CQZ:2>14 <DXCC:3>227 <ITUZ:2>27 <MODE:2>CW <OPERATOR:5>TK5EP <QSO_DATE:8:D>19940129 <RST_RCVD:3>599 <RST_SENT:3>599 <TIME_ON:6>060900 <TIME_OFF:6>060900 <APP_LOGGER32_QSO_NUMBER:1>9 <EOR>

<BAND:3>80M <CALL:8>F5OQJ/79 <CONT:2>EU <CQZ:2>14 <DXCC:3>227 <ITUZ:2>27 <MODE:2>CW <OPERATOR:5>TK5EP <QSO_DATE:8:D>19940129 <RST_RCVD:3>599 <RST_SENT:3>599 <TIME_ON:6>061000 <TIME_OFF:6>061000 <APP_LOGGER32_QSO_NUMBER:2>10 <EOR>

<BAND:3>80M <CALL:8>TK5EL/2B <CONT:2>EU <CQZ:2>14 <DXCC:3>223 <IOTA:6>EU-005 <ITUZ:1>0 <MODE:2>CW <OPERATOR:5>TK5EP <QSO_DATE:8:D>19940129 <RST_RCVD:3>599 <RST_SENT:3>599 <TIME_ON:6>061001 <TIME_OFF:6>061001 <APP_LOGGER32_QSO_NUMBER:2>11 <EOR>

<BAND:3>80M <CALL:8>TK5XN/2A <CONT:2>EU <CQZ:2>14 <DXCC:3>223 <IOTA:6>EU-005 <ITUZ:1>0 <MODE:2>CW <OPERATOR:5>TK5EP <QSO_DATE:8:D>19940129 <RST_RCVD:3>599 <RST_SENT:3>599 <TIME_ON:6>061002 <TIME_OFF:6>061002 <APP_LOGGER32_QSO_NUMBER:2>12 <EOR>

ViPHP
ViPHP | 1380 Messages

30 déc. 2005, 17:25

Pour le parse, je ne changerais rien dans un premier temps.

Mais pour l'injection, une fois parsé, tu devrais essayer de te constituer un fichier plat avec le contenu de chaque champ de ta table avec un séparateur de ton choix.

Code : Tout sélectionner

1994-01-29;06:06:00;F6KQW/39;80M;CW;Y;Y;599;599;1994-01-29; 1994-01-29;06:08:00;F6BDM/59;80M;CW;Y;Y;599;599;1994-01-29; 1994-01-29;06:09:00;F5JNT/30;80M;CW;N;N;599;599;;
Et seulement ensuite d'injecter en une fois tout ce fichier dans ta table avec un LOAD DATA INFILE ...


Là tu devrais voir la différence.
ripat

Eléphanteau du PHP | 18 Messages

31 déc. 2005, 12:16

Merci,

J'ai modifié mon script pour créer un fichier "plat", j'ai vérifié la structure est bonne.
J'ai tenté une requête LOAD DATA INFILE sur le serveur de mon hébergeur FREE, mais je reçois :

"Access denied for user 'tk5ep'@'212.27.63.124' (using password: YES)"

J'ai utilisé la requête la + basique possible, donc avec les paramètres par défaut, j'ai créé mon fichier plat en conséquence (TAB et RETURN, champs dans le bon ordre)

Je sais pas trop où ça coince, je suppose côté hébergeur qui n'a pas validé cette requête.. ??
Dans la doc, il est dit qu'il faut que j'ai le privilège file et que le chemin soit bon, je n'ai pas de maîtrise, ni sur l'un ni sur l'autre....

Si je pense distribuer mon script un jour, je m'expose à des problèmes si cette requête n'est pas valide chez tous les providers !

Bon, pour ma culture et tests , je vais essayer de résoudre MON problème, mais pour plus de compatibilité je vais laisser le script avec la requête INSERT dans la boucle...

Peut-être y a t'il moyen d'optimiser ces requêtes INSERT ?

@ plus et bon réveillon à tous,

Mammouth du PHP | 19672 Messages

31 déc. 2005, 12:55

"Access denied for user 'tk5ep'@'212.27.63.124' (using password: YES)"
Soit il y a une erreur dans le mot de passe, soit il n'y en a tout simplement pas besoin. Ce n'est pas priori pas un problème de syntaxe. Du reste tu pourrais le vérifier en testant ta requête en ligne dans phpMyAdmin (http://sql.free.fr)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 1380 Messages

31 déc. 2005, 13:19

Dans la doc, il est dit qu'il faut que j'ai le privilège file et que le chemin soit bon, je n'ai pas de maîtrise, ni sur l'un ni sur l'autre....
Effectivement, il faut les privilèges FILE.

Dommage car j'ai repris ta fonction et construit un fichier de données et une table sur le format que tu as transmis plus haut j'ai j'ai un gain de 50% en temps d'exécution (DROP INDEX -> LOAD DATA INFILE -> ALTER TABLE ADD INDEX (callsign))

8 secondes au lieu de 17 sec. pour 47.000 lignes de données.

Essaye déjà de faire DROP INDEX -> INSERT en boucle -> ALTER TABLE ADD INDEX (callsign)

Reste ta fonction de parsing. Je regarde si ça vaut la peine de la modifier.
ripat