messaggio di attesa...

Ciauz...

Ho uno scrript PHP che carica mooolti dati da un database Access (si... vabbé... database...  :2funny: ) via ODBC.

Sia perché il file MDB è pesantino, sia perché lo script esegue 3 query in catena, prima di visualizzare totalmente la pagina (che poi è destinata ad essere stampata) passano anche più di 60 secondi.

Volevo quindi visualizzare un "messaggio" per indicare all'utente di portare pazienza... Ho quindi creato una DIV fluttuante che viene poi nascosta alla fine dello script. Il problema è che prima di visualizzare la DIV (pur essendo il primo TAG subito dopo il BODY) passa comunque qualche secondo, e poi me la visualizza già con dei dati dietro o comunque quasi alla fine del caricamento della pagina (inteso come tempistica)...

E' possibile fare in modo che una porzione di script (almeno fino alla DIV del messaggio) venga visualizzata immediatamente? Non so... un precaricamento, una qualche impostazione cache...

A quel punto ci ficcherei dentro anche una bella GIF animata con una clessidra che gira e l'utente se ne sta buono buonino, senza pensare che si sia inchiodato tutto...

Grazie fin d'ora! (non è vitale...)

Mauro

 :bye:

inviato 10 anni fa
myne.it
X 0 X

Penso che dovresti fare una funzione javascript che carichi qualcosa che serve a te al caricamento:

onLoad()

della pagina...

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Penso che dovresti fare una funzione javascript che carichi qualcosa che serve a te al caricamento:

onLoad()

della pagina...

Mah... le ho provate un po' tutte... ma ho l'impressione che prima di cominciare a visualizzare la pagina, esegua tutto il codice <?php>: io credevo che fosse una creazione passo-passo, in cascata...

mi sfugge qlcs...

?

risposto 10 anni fa
myne.it
X 0 X

Prova con questo:

<SCRIPT language="Javascript">
function nascondi() {
if (document.all) {
document.all.loading.style.visibility="hidden";
}
else if (document.layers) {
document.layers.loading.visibility="hide";
}
else if (document.getElementById) {
document.getElementById.loading.style.visibility="hidden";
}
}
window.onload=nascondi;

</SCRIPT> 

<body>

<div align="center" style="font-style:italic;font-size: x-small;position:relative;" id="loading">La pagina è in caricamento...</div>

 :bye:

risposto 10 anni fa
Nico Colonna
X 0 X

Il problema risiede nella dinamica che sottende l'invio di una pagina PHP. Il PHP infatti mentre produce dell'output non è detto che lo invii immediatamente ad Apache. Anche Apache a sua volta non invia immediatamente l'output ricevuto da  PHP al browser. Questo è un bene perché permette di utilizzare al meglio il protocollo TCP/IP che è alla base della comunicazione client e server. Infatti se venissero subito spediti i dati al client si correrebbe il rischio di inviare sulla rete molti pacchetti "scarichi", ovvero con poco contenuto. Invece conviene inviare meno pacchettti ma più carichi di contenuto. Per fare ciò è necessario però attendere prima di inviare i dati.

E' però possibile costringere il PHP a svuotare la sua cache di output usando il comando flush(). Ovviamente questo comando non ha alcuna influenza su Apache pertanto l'effettivo risultato non è garantito.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Prova con [...]

 :bye:

Ti ringrazio, ma il mio problema non è come mostrare o nascondere un DIV... il mio è proprio un problema di "tempistica"

Ci ha azzeccato Gianni (infatti per sfizio farò una prova con flush())...

Il concetto è che ora che il PHP ha elaborato il codice e che Apache si è deciso ad inviare la pagina al browser, l'utente si è già "sorbito" 65 secondi di pagina bianca con clessidra annessa...

Io per primi, in una condizione del genere, terminerei la pagina e darei del 'irla a chi l'ha sviluppata...

La fortuna è che si tratta di una pagina intranet, quindi è sufficiente avvisare gli utente che quella determinata pagina ha un tempo di caricamento parecchio lungo...

Ma per "correttezza e pulizia", se riesco a visualizzare il messaggio subito, è meglio...

ora provo flush()

Grazie comunque, Fred!

 :bye:

risposto 10 anni fa
myne.it
X 0 X

eh... che sfighen!

Ho provato flush()  ???

Per l'esattezza:

<?php
ob_start();

echo "
<DIV ID=\"messaggio\">
   ATTENDERE IL CARICAMENTO DEI DATI...<BR>
   <BR>
   L'operazione potrebbe richiedere anche <BR>pi&ugrave; di 1 minuto...<BR>
   Attendere il messaggio di conferma...
</DIV>";

ob_flush();
flush();
ob_end_flush();
?>

Ma la cosa non ha dato esito diverso da prima...  >:(

Ora: non so se come ho interpretato io il modo d'uso di flush, è corretto... resta il fatto che sulla documentazione di PHP (http://it.php.net/manual/it/function.flush.php) si trova questa scritta:

Several servers, especially on Win32, will still buffer the output from your script until it terminates before transmitting the results to the browser.

E dato che il mio server Apache gira su una macchina WXpPro...

 :dunno:

risposto 10 anni fa
myne.it
X 0 X

Ma chi s'ingegna...

Non so quanto possa essere considerata "elegante", ma una soluzione alternativa l'ho trovata:

Ho creato una pagina "intermedia" che visualizza il messaggio e che richiama la pagina di elaborazione dopo 5 secondi:

<?php
   // Recupera i parametri $_GET
   $parametri = $_GET['parametri'];
?>
<HTML>
<HEAD>
   <TITLE></TITLE>
   <META HTTP-EQUIV="refresh" CONTENT="5;URL=./pagina.php?parametri=<?php echo $parametri; ?>"/>
</HEAD>
<BODY>
<DIV ID="messaggio">
   ATTENDERE IL CARICAMENTO DEI DATI...<BR>
   <BR>
   L'operazione potrebbe richiedere anche <BR>pi&ugrave; di 1 minuto...<BR>
   Attendere il messaggio di conferma...
</DIV>
</BODY>
</HTML>

Il messaggio è poi riproposto anche della pagina finale (stessa posizione/dimensione/testo) e durante il caricamento di quest'ultima rimane visualizzato...

L'impressione è che avvenga un solo caricamento con il messaggio in primo piano...

Che ne dite?

 ::)

risposto 10 anni fa
myne.it
X 0 X

Ci sta! Hai anticipato il mio prox commento. ^-^ O0

 :bye:

risposto 10 anni fa
Nico Colonna
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda