Newsgroup: it.comp.www.php
Titolo: delay su una funzione

Ciao a tutti.
Avrei bisogno di ritardare l'esecuzione di una function. La situazione è
questa:
<body>
       <!-- corpo pagina -->
<?php
 function Verifica($a, $b) 
 {
 // condizione
 // istruzione
 }
//   Poi la chiamata:
Verifica(1, 2); /* vorrei che questa chiamata non avvenisse subito, ma
con qualche secondo di ritardo. */
?>
Se però metto
 function Verifica($a, $b) 
sleep(30);
Verifica(1, 2);
il corpo pagina non si carica subito: attende i 30 secondi. Come posso
fare per caricare SUBITO la pagina ed attendere l'esecuzione della
function?
Grazie mille
-- 
Nicoletta

 function?
PHP e' un linguaggio server side.
-- 
I'am what I'am, I do what I can


Fai leggere allo script la pagina, fanne un flush verso il webserver, lancia
la funzione, e poi continua con l'output.
Uso questa cosa per fare una barra di completamento in javascript... faccio
le print della stessa chiamata a funzione ma con valori sempre diversi e, in
funzione della velocità con le quali arrivano al webserver, significa che
sto raggiungendo il 100%... a 5% per volta...

 -- 
E' vero che il modo con il quale il server invia i dati al client non può
essere totalmente controllato, ma è anche vero che i webserver non aspettano
di avere in 'mano' tutta la pagina prima di inviarla al client, ma lo fanno
un poco per volta... quindi si può anche pilotare, con le dovute tecniche,
quando una funzione viene valutata.
J

 [snip]
http://it2.php.net/manual/en/function.flush.php
Leggiti anche i commenti.
-- 
http://e-0.org

 funzione viene valutata.
Si, ma la domanda e' un'altra, quale e' la necessita' che sta dietro a
far attendere che una funzione venga eseguita?


 far attendere che una funzione venga eseguita?
La necessità è molto semplice, ma non è altrettanto semplice
descriverla; diventerebbe tutto chiaro se partissi da altre (numerose)
necessità che stanno a monte del caso. Il post tuttavia, come si
intuisce dalla premessa, diverrebbe un po' "lunghetto" ^_^
Io comunque non ho problemi né segreti a parlarne, se ti fa piacere
parto dall'inizio e ne descrivo ogni particolare. Dimmi tu.
Approfitto di questo spazio per ringraziare tutti i partecipanti al
thread; stasera, quando torno dal lavoro, cerco di studiare e capire la
funzione flush.
Ciao e buona giornata
-- 
Nicoletta

 intuisce dalla premessa, diverrebbe un po' "lunghetto" ^_^
Sono abbastanza convinto che esistano soluzioni aleternative a quella
di uno sleep di 30 secondi, oltretutto se inizi ad avere molti utenti
concorrenti il server potrebbe risentirne.
Prova a descrivere in breve la necessita' che sta alla base.


 Prova a descrivere in breve la necessita' che sta alla base.
"descrivere in breve" mi mette in crisi ^_^ A questo punto non so se sia
più cortese esporre i fatti o tacere. Augurandomi di non essere
eccessivamente invasiva, opto per "dirla tutta"; chiedo scusa a coloro
che scaricheranno un post inutile e nient'affatto interessante.
Dunque, ho un "amico di email" (conosciuto su questo gruppo) col quale
mi diverto a scambiare opinioni, idee e pareri. L'amico, in seguito alla
mia domanda "secondo te, è possibile sapere quanti utenti stanno
visitando un sito contemporaneamente?", mi ha risposto così:
==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==
Siccome il browser - quando abbandona il sito - non invia alcuna
informazione al server, credo sia impossibile saperlo con certezza.
Un'idea potrei anche averla ma, se decidi di porla in essere, prendila
come esercizio didattico, niente di più. Riguardo al metterla in pratica
chiedi lumi sul gruppo dedicato al php; io (come ben sai) col php non ho
troppa dimestichezza.
- crea una cartella Pippo
- quando un utente carica una pagina scrivi un file in cartella Pippo
- il file è vuoto, le informazioni che ti servono le ricaverai dal
*nome* del file
- il nome del file costruiscilo così:
a) recupera la data dal server nel formato 2003/05/02, nonché l'ora
esatta al secondo (diciamo 12:05:32)
b) cattura l'IP dell'utente (fai conto 11.22.33.44)
c) ricomponi il nome del file in questo modo
"f_20030502120532_11.22.33.44"
- ogni (diciamo) 30 secondi re-invia un nuovo file in cartella Pippo MA
PRIMA effettua questa operazione su TUTTI i file in cartella Pippo:
 function Controlla() {
   for ($i=0; $i <= $QuantiFile; $i++) {
a) explodi() il nome in base al separator underscore ("_")
b) adesso hai l'elemento array[0] (che non ti interessa), l'elemento
array[1] che contiene un numero (la cui lunghezza è sempre la stessa;
OCCHIO: dovrai farci dei calcoli) e l'elemento di array[2] che contiene
l'IP dell'utente.
Ora viene il difficile: ogni utente che arriva, oltre che scrivere il
file, ti fa da trampolino per effettuare il controllo.
Ragioniamo.
Se il file che viene inviato dopo 30 secondi ha un IP identico a un
altro inviato *non più di 30 secondi prima*, è (quasi) matematico che
l'utente sia lo stesso. Ti torna? 
Pertanto, quando il controllo dà esito positivo, il file_2 rimpiazza il
file_1; in caso contrario il file_2 va ad aggiungersi alla lista degli
altri file.
Cancellando costantemente tutti i file più vecchi di 35 secondi, la
variabile $QuantiFile dovrebbe corrispondere, uno più uno meno, al
numero di utenti sul tuo sito.
Volendo, se la variabile $QuantiFile >= $numeroCheScegli, puoi decidere
di auto-inviarti un email che dice "alle ore x il numero di utenti sul
sito era di (circa) $numeroCheScegli. 
Non appena i file sono 0 (zero) la funzione Controlla() muore, e riparte
quando si riaffaccia un utente.
Lo script, ovviamente, va includato() in tutte le pagine del sito.
Riflettici su. A me sembra che il ragionamento fili, ma non escludo ci
sia qualche punto debole, non ne ho certezza, dovrei applicarmici meglio
e sperimantare.
==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==
Tutto è derivato da questo. Ciao e grazie ^_^
-- 
Nicoletta

 Riflettici su. 
Ci ho riflettuto e penso di aver nuovamente dimostrato come i newbie
NON DEBBANO MAI chiedere come fare quello che pensano di voler fare, ma
quale sia il problema che vogliono risolvere.


 quale sia il problema che vogliono risolvere.
A parte il fatto che "riflettici su" era nel corpo email (dunque
riferito a me, non a te), non c'era nessun problema da risolvere; c'era
solo la voglia di farmi viva sul gruppo e, se possibile - dialogando
serenamente - di capire se, e come una funzione può essere ritardata.
Gentile Setec Astronomy, francamente non capisco perché tu debba essermi
così ostile. Una colpa sì, non nascondo di averla: mi sono
eccessivamente dilungata; d'altronde era l'unico modo per risponderti
con chiarezza.
Ciao, grazie, scusa il disturbo.
-- 
Nicoletta

 Prova a descrivere in breve la necessita' che sta alla base.
e la rispsota sarebbe potuta stare in 1 riga:
Mi serve per uno script per il conteggio degli utenti online.


 la funzione, e poi continua con l'output.
Intanto grazie dell'interessamento.
Ho appena letto quello che il manuale dice di flush, ma sono andata
immediatamente in crisi. Ti mostro:
void flush ( void)
Flushes the output buffers (etc.)
Eccomi subito in difficoltà: sfortunatamente non so cos'è un buffer. Fa
niente, cercherò di impararlo al più presto, così potrò andare avanti.
Grazie di nuovo :)
-- 
Nicoletta

 Mi serve per uno script per il conteggio degli utenti online.
Sarebbe stata una menzogna, ribadisco: non mi serve nessuno script per
il conteggio degli utenti; quello che mi serve (o meglio: che mi sarebbe
servito) è sapere come si ritarda una funzione (vedi oggetto del
thread). Se si può fare, naturalmente.
Ti è mai capitato di parlare con un amico - che ne so - di
un'automobile, ed a un certo momento di chiederti che cos'è una
cilindrata? Un motore a scoppio? Una frizione? Un differenziale?
Ecco, a me è successo questo. Sono venuta nel gruppo di esperti di
"motori" e ho chiesto "che cos'è una cilindrata?" Poi, se tu mi chiedi
qual è l'esigenza, io (con l'unico intento di dialogare), avendo
contemporaneamente mille esigenze e nessuna esigenza, ti racconto per
filo e per segno cosa mi ha condotto a porre il quesito. Ma non ho
bisogno di un'automobile, altrimenti avrei chiesto un'automobile.
Le mie pretese: nessuna. So bene che non c'è alcun obbligo di risposta.
-- 
Nicoletta

Eccomi subito in difficoltà: sfortunatamente non so cos'è un buffer
l'output di uno script, invece di essere visualizzato subito, viene
messo in un buffer, cioe' un'area di memoria.
Quando tale buffer e' pieno (o quando lo script termina), allora il
buffer viene svuotato e l'output viene visualizzato.
Tanto per farti un esempio, se hai una pagina che genera un output di
129 Kb e il buffer e' di 64K, allora l'output verra' generato in tre
fasi: 
1) viene riempito il buffer per 64 Kb e, visto che e' pieno, viene
svuotato => output dei primi 64Kb
2) vengono riempiti altri 64K => output di altri 64Kb
3) il buffer viene riempito con 1Kb. Lo script termina e, quindi, il
buffer viene svuotato per l'ultima volta => ultima trance di output.
I 64Kb di dimensione sono solo un esempio, eh. Un buffer potrebbe
essere grande 4096 bytes.
-- 
http://e-0.org

 messo in un buffer, cioe' un'area di memoria.
Bellissimo! Ottima ed esauriente spiegazione, le idee iniziano a
schiarirsi. 
Grazie della gentilezza, a presto ^_^
-- 
Nicoletta

 lancia la funzione, e poi continua con l'output.
Non hai tenuto presente un fatto.
A seconda di come viene implementato il motore di rendering del browser
che riceve la pagina questa tecnica puo' funzionare o non funzionare.
