Afficher une barre de progression dans bouche

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Afficher une barre de progression dans bouche

par tk5ep » 31 déc. 2005, 18:00

O,

Nos posts se sont croisés.... :)

J'ai fait quelques tests avec DROP et sans, je ne vois pas de différence. En principe lorsque j'applique mon script, la base est vide donc de toute façon, ça ne devrait rien changer.
J'ai cependant fait des essais avec une base remplie de 55000 lignes, mais pareil, pas de différence significative.

Pour la barre, pas de différence en rajoutant le flush(), j'avais déjà tout essayé. Rien ne s'affiche pendant l'exécution, mais tout à la fin !
J'ai pourtant des données qui arrivent , puisque mon routeur indique de l'activité. Ca clignote à chaque paquet reçu, donc chaque |||

J'ai supprimé l'envoi de ||| pendant l'exécution du script, et là c'est pire, le script ne s'exécute pas et la base n'est pas remplie !
time out ...

Peut-être que du javascript pourrait résoudre le problème côté client, avec interruption quand arrive les données en fin du script ?

OK pour la tache de fond, je vais essayer. Jamais essayé..

Bon, je vais aussi préparer le réveillon...

@ ++,

par Ripat » 31 déc. 2005, 14:46

Je vais tenter le coup de DROP index pour réduire encore, mais là j'y crois pas de trop..
Tu as tort car si tu fais un INSERT sur une table indexée, MySQL doit mettre la table ET l'index à jour. Et la mise à jour d'un index sur des grosses tables prend beaucoup de temps. Autant ne le faire qu'une seule fois, à la fin de l'injection.
et en plus ce sera pas mesurable avec mes temps de connexion pourris.
Je crois que la connnexion ne changera pas grand chose au temps d'exécution d'un script côté serveur :wink:
Restera après toutes ces optimisations à trouver une astuce indiquant au client que quelque chose se passe côté serveur et ne pas tomber dans le time out !!@ ++,


Tu fais tourner le script en arrière-plan en envoyant un header 200 OK (avec un texte du genre: "traitement en cours" et en continuant dans le même script l'injection. Pour le timeout, il n'y a rien à faire sinon négocier avec ton hébergeur!

edit

J'oubliais le sujet principal du post: la barre de de progression. Il manque un flush() dans ta fonction. Essaye:
    if ($NbQso % 500 == 0){
      $bar ='|';
      ob_start();
      $bar = strlen($bar) > 10 ? $bar : str_pad($bar, 10);
      echo $bar;
      ob_end_flush();
      flush();
    }
Testé dans FF et IE.

par tk5ep » 31 déc. 2005, 14:37

OK, j'ai posé la question à mon hébergeur au sujet de la commande, on verra ce qu'ils vont répondre, s'ils répondent !

Je me suis aperçu que j'ai mis une requête SQL dans ma boucle (je me suis mélangé les crayons avec tous ces {} , alors que je n'avais besoin que d'un seule requête !!
Ca a nettement réduit le temps d'exécution du script, car je faisais cette requête sur une autre table !

Je vais tenter le coup de DROP index pour réduire encore, mais là j'y crois pas de trop.. et en plus ce sera pas mesurable avec mes temps de connexion pourris.

Merci encore pour tes conseils,

Restera après toutes ces optimisations à trouver une astuce indiquant au client que quelque chose se passe côté serveur et ne pas tomber dans le time out !!

@ ++,

par Ripat » 31 déc. 2005, 14:32

Je crains qu'il n'y pas grand chose à changer dans ta fonction de parsing. Utiliser les regex pour parser consommerait trop de ressources. Et sur 50.000 lignes...

Pistes:
Tester le privilège FILE, si oui -> LOAD DATA INFILE
Sinon, envisager de faire tourner l'injection en arrière plan (voir mon lien plus haut).

Dernière suggestion, pour un script qui prend autant de temps, envisager d'empêcher l'utilisateur d'arrêter le script en plein milieu sous peine d'avoir une table incomplète. Pour ça, vois du côté de http://www.php.net/manual/fr/function.i ... -abort.php

par Ripat » 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.

par Cyrano » 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)

par tk5ep » 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,

par Ripat » 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.

par tk5ep » 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>

par Ripat » 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.

par tk5ep » 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);

par Ripat » 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

par tk5ep » 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,

par Ripat » 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.

par tk5ep » 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,