Newsgroup: it.comp.www.php
Titolo: Funzioni ob_* e timeout: differenza linux e win

Salve!
Sto testando in questi giorni una serie di script che fanno largo uso
delle funzioni di controllo del flusso (ob_* ).
In pratica, la base dello script è più o meno questa funzione ricorsiva
(riscritta 'banalmente'):
function aggiorna() {
    $var = "qualcosa" // Dati letti da un DB
    print $var;
    flush();
    sleep(20);
    aggiorna();
}
Ossia un loop che dice: leggiti i dati dal db, stampa, fai un bel flush,
stattene buona per 20 secondi e riparti.
Ho provato ad utilizzarla su diversi sistemi Linux/Unix con diverse
versioni di PHP ( > 4.0.x ) e non ho problemi. Se provo con un server
Win2000 con Apache, lo script mi va in timeout con il "classico"
messaggino "Script execution timed out after 30 seconds ... ".
Sinceramente, non so se chiedermi se il comportamento dello script sia
corretto con Win ma non con Linux (in fin dei conti, in php.ini il
timeout è impostato a 30 secondi, e la funzione ricorsiva là sopra non
fa altro che tenermi in hang lo script, senza "rilanciarlo") o se sia
corretto con Linux e sia una qualche "carenza" di Win ...
In ogni caso, visto che l'applicazione andrà a girarmi su un server
Linux, non mi faccio grandissimi problemi! Quello che mi chiedo, però, è
come mai il PHP con Windows mi sputi fuori un timeout e con Linux no ...
Idee in merito?
--ev

 messaggino "Script execution timed out after 30 seconds ... ".
sembra corretto. lo script dura piu' di 30 secondi;
infatti dura all'infinito.
Ma le impostazioni del timeout su linux come sono ?
Piu' che altro volevo sollevare un'altro problema:
non fa bene allo stack chiamare una funzione ricorsiva che richiama se'
stessa e
che non termina mai.
Sarebbe meglio se fosse un loop fatto con un while(1).

 Sarebbe meglio se fosse un loop fatto con un while(1).
Per come la vedo, la cosa è identica: while(1) è sempre vero e l'unica
differenza è:
- con while(1) il _loop_ non termina mai.
- con la funzione ricorsiva postata sopra, la _funzione_ non termina
  mai.
Insomma, qualcosa che non termina mai c'è sempre! ;-)
Il fatto è che mi servirebbe, per questioni di "leggerezza", uno script
che continua a leggere dati da un DB e accodarli ad una pagina *senza*
continuare a refreshare la pagina stessa ...
So che così com'è fa un po' pena: mi restano aperte connessioni al DB
anche se viene chiuso il browser (forse con Js riesco a fare qualcosa,
comunque!), e non so cosa succeda al povero script in loop quando viene
chiuso il browser, però sto ancora vedendo di trovare qualche soluzione
per limitare gli "sprechi" ... Pian piano ... :-)
Ciao
--ev

 continuare a refreshare la pagina stessa ...
non e' una buona cosa rilassare le condizioni sul timeout
dello script solo perche vuoi farne durare uno all'infinito.
non dovrebbero esserci, anzi non devono esserci,
istanze di apache che girano all'infinito!
e se chiami piu' volte quell' URL che accade ?
2 o piu' istanze dello script che girano all'infinito ?
per queste cose io in passato facevo uno script con wget che era richiamato
da cron diciamo, ogni 15 minuti (o ogni 5).
lo script vive 20 secondi o quel che e' e puoi muore.
poi mi sono evoluto :-) e da quando ho scoperto che puoi
scrivere in php anche degli script da lanciare poi a riga di comando,
mi sono fatto gli script (come fosse erl, ne piu' ne meno)
secondo me dovresti farti uno script e lanciarlo in rc.local

 secondo me dovresti farti uno script e lanciarlo in rc.local
Magari!!!
A parte che non ho il server "sottomano", quindi non posso utilizzare
cron e compagnia bella, non credo che in ogni caso sarebbe la soluzione
che cerco!
In ogni caso, _forse_ qualcosa riesco a fare; in pratica, visto che
lavoro anche con le sessioni, pensavo di fare una cosa del genere:
while(1) { // dicono sia meglio usare un while()! :-P
    Fai_quello_che_devi_fare();
    if(!session_is_registered('qualcosa')) { exit; }
    sleep($time);
}
Così, con la penultima riga, dovrei bloccare l'esecuzione dello script
nel caso l'utente lasci fisicamente la pagina, quindi senza lasciare la
funzione in esecuzione infinita ...
Tutto ancora da testare, vediamo come andrà a finire!!!
ciao!
--ev