par
Couin » 30 sept. 2018, 03:34
PloP !
Alors voilà le script adapté.
Une page sauvetable.php par exemple , avec dans le head :
Code : Tout sélectionner
<link rel="stylesheet" href="//apps.bdimg.com/libs/jqueryui/1.10.4/css/jquery-ui.min.css">
<script src="//apps.bdimg.com/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="//apps.bdimg.com/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<link rel="stylesheet" href="jqueryui/style.css">
<script>
function startTask(table) {
document.getElementById(table).disabled = 'disabled';
fichier = 'sse_progress_' +table + '.php';
es = new EventSource(fichier);
es.addEventListener('message', function(e) {
var result = JSON.parse( e.data );
if(e.lastEventId == 'CLOSE') {
es.close();
var pBar = document.getElementById('progressor'+table);
pBar.value = pBar.max; //max out the progress bar
var perc = document.getElementById('percentage'+table);
perc.innerHTML = "100% de " + result.message + " lignes";
} else {
var pBar = document.getElementById('progressor'+table);
pBar.value = result.progress;
var perc = document.getElementById('percentage'+table);
perc.innerHTML = result.progress + "% de " + result.message + " lignes";
perc.style.width = (Math.floor(pBar.clientWidth * (result.progress/100)) + 15) + 'px';
}
});
}
</script>
Dans le body :
Code : Tout sélectionner
<input type="button" style="width:150" id="songs" onclick="startTask('songs');" value="Table 'songs'" /> <progress id='progressorsongs' value="0" max='100' style=""></progress> <span id="percentagesongs" style="text-align:left; display:inline; margin-top:5px;"></span>
A noter que pour le moment je n’ai pas épluché la nécessité des fichiers js et css .
Et une page sse_progress_songs.php avec dedans :
Code : Tout sélectionner
header('Content-Type: text/event-stream');
// recommended to prevent caching of event data.
header('Cache-Control: no-cache');
function send_message($id, $message, $progress) {
$d = array('message' => $message , 'progress' => $progress);
echo "id: $id" . PHP_EOL;
echo "data: " . json_encode($d) . PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}
Puis la requête avec boucle while :
Code : Tout sélectionner
$i = 0;
$r = 0;
$query = "SELECT * FROM songs";
$results=mysql_query($query,$opened_db);
$num_rows = mysql_num_rows($results);
while($row=mysql_fetch_row($results)){
$i++;
$blablabla = $row[0]; etc etc ...
mysql_query("INSERT INTO songs (blablabla) VALUES ('$blablabla')",$dbwrite);
if ($r >= 100) {
send_message($i, $num_rows , round($i*100/$num_rows) );
usleep(20000);
$r = 0;
}
$r++;
} Notons dans le cas présent que je SELECT une table pour la copier dans une autre, ce qui me permet d'avoir le nombre de lignes totales à traiter et donc de déduire le pourcentage d'avancement.
Notons également que, j'envoie l'info de pourcentage effectué, toutes les 100 lignes, car avec avec plus de 7400 lignes, le truc perd les pédales au bout de quelques % .
A adapter au besoin .Concernant une autre table ayant 1000 lignes seulement j'ai mis 10 au lieu de 100.
Ca permet de rester assez précis sans crouter le bin's lol
Possible également que le usleep ne soit pas indispensable.
Et au final, on envoie le message de fin :
En effet, ce dernier permet de bien terminer le travail et d'afficher les 100% et barre complète . Sans lui, on a pas 100% si le nombre de ligne à traiter n'est pas un multiple de "100" (dans le if if $r du cas présent).
Voilà, ce n'est peut-être pas la solution la plus propre mais elle répond à mon besoin et c'est surtout la seule que j'ai trouvé sans passer par des curl et autres étrangetés lol
A tôbien !

Couin
PloP !
Alors voilà le script adapté.
Une page sauvetable.php par exemple , avec dans le head :
[code]
<link rel="stylesheet" href="//apps.bdimg.com/libs/jqueryui/1.10.4/css/jquery-ui.min.css">
<script src="//apps.bdimg.com/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="//apps.bdimg.com/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<link rel="stylesheet" href="jqueryui/style.css">
<script>
function startTask(table) {
document.getElementById(table).disabled = 'disabled';
fichier = 'sse_progress_' +table + '.php';
es = new EventSource(fichier);
es.addEventListener('message', function(e) {
var result = JSON.parse( e.data );
if(e.lastEventId == 'CLOSE') {
es.close();
var pBar = document.getElementById('progressor'+table);
pBar.value = pBar.max; //max out the progress bar
var perc = document.getElementById('percentage'+table);
perc.innerHTML = "100% de " + result.message + " lignes";
} else {
var pBar = document.getElementById('progressor'+table);
pBar.value = result.progress;
var perc = document.getElementById('percentage'+table);
perc.innerHTML = result.progress + "% de " + result.message + " lignes";
perc.style.width = (Math.floor(pBar.clientWidth * (result.progress/100)) + 15) + 'px';
}
});
}
</script>[/code]
Dans le body :
[code]<input type="button" style="width:150" id="songs" onclick="startTask('songs');" value="Table 'songs'" /> <progress id='progressorsongs' value="0" max='100' style=""></progress> <span id="percentagesongs" style="text-align:left; display:inline; margin-top:5px;"></span> [/code]
A noter que pour le moment je n’ai pas épluché la nécessité des fichiers js et css .
Et une page sse_progress_songs.php avec dedans :
[code]header('Content-Type: text/event-stream');
// recommended to prevent caching of event data.
header('Cache-Control: no-cache');
function send_message($id, $message, $progress) {
$d = array('message' => $message , 'progress' => $progress);
echo "id: $id" . PHP_EOL;
echo "data: " . json_encode($d) . PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}[/code]
Puis la requête avec boucle while :
[code]$i = 0;
$r = 0;
$query = "SELECT * FROM songs";
$results=mysql_query($query,$opened_db);
$num_rows = mysql_num_rows($results);
while($row=mysql_fetch_row($results)){
$i++;
$blablabla = $row[0]; etc etc ...
mysql_query("INSERT INTO songs (blablabla) VALUES ('$blablabla')",$dbwrite);
if ($r >= 100) {
send_message($i, $num_rows , round($i*100/$num_rows) );
usleep(20000);
$r = 0;
}
$r++;
} [/code]Notons dans le cas présent que je SELECT une table pour la copier dans une autre, ce qui me permet d'avoir le nombre de lignes totales à traiter et donc de déduire le pourcentage d'avancement.
Notons également que, j'envoie l'info de pourcentage effectué, toutes les 100 lignes, car avec avec plus de 7400 lignes, le truc perd les pédales au bout de quelques % .
A adapter au besoin .Concernant une autre table ayant 1000 lignes seulement j'ai mis 10 au lieu de 100.
Ca permet de rester assez précis sans crouter le bin's lol
Possible également que le usleep ne soit pas indispensable.
Et au final, on envoie le message de fin :
[code]send_message('CLOSE', $num_rows);[/code]
En effet, ce dernier permet de bien terminer le travail et d'afficher les 100% et barre complète . Sans lui, on a pas 100% si le nombre de ligne à traiter n'est pas un multiple de "100" (dans le if if $r du cas présent).
Voilà, ce n'est peut-être pas la solution la plus propre mais elle répond à mon besoin et c'est surtout la seule que j'ai trouvé sans passer par des curl et autres étrangetés lol
A tôbien ! :D
Couin