Newsgroup: it.comp.lang.perl
Titolo: aruba upload

Ciao,
ho un filemanager che visualizza una progress bar durante gli upload. 
L'upload avviene tramite script perl che crea anche un file txt con le 
statistiche. Le statistiche vengono lette da php per aggiornare una 
progressbar lato client.
In locale tutto funziona correttamente (perl crea e aggiorna il file di 
statische mentre php lo legge periodicamente). Su hosting aruba il file 
di statistiche esiste solamente se interrompo l'upload, quindi alla 
chiusura dello script. Non conosco bene perl ma penso che sia un problema 
con il flush del buffer. E' possibile che lo stesso codice si comporti in 
modo diverso a causa della configurazione dell'hosting?
Cosa posso cercare/modificare?
Ciao, Leo

 Cosa posso cercare/modificare?
Giusto per provare, metti questa linea come prima istruzione del tuo 
script Perl:
$| = 1;



Ciao, grazie della risposta.
Purtroppo il comportamento è sempre lo stesso anche con $| = 1;
L'OS del server locale e quello di aruba sono entrambi linux.
Leo


$| controlla il buffering sul filehandle "corrente" (solitamente
STDOUT), mentre magari nel tuo caso il filehandle del file delle
statistiche non è lo stesso. In questo caso potresti utilizzare questa
tecnica:
use IO::Handle;
# qui apri il file delle statistiche
open my $fh_stats, '>', '/path/to/file.txt'
   or die "open(): $!";
# qui disabiliti il buffering sul filehandle
$fh_stats->autoflush(1);
In alternativa, potresti provare a chiudere il file e riaprirlo ad
ogni aggiornamento delle statistiche, non so se questo farebbe
diventare troppo "frenetico" il tuo processo ma di sicuro dovrebbe
assicurare la creazione e l'aggiornamento del file.
Ciao,
    Flavio.

     Flavio.
Ciao,
innanzi tutto grazie per la risposta molto completa e dettagliata.
Purtroppo ho appena ricevuto questa risposta da Aruba:
"in merito alla sua segnalazione la informo che per motivi tecnici è 
attivo il Lock dei file nel FileSystem e, quindi, come da lei 
riscontrato, finché il file non è stato correttamente uploadato non è 
possibile accedere al file stesso o a file temporanei che si generano in 
concomitanza con l'operazione di upload".
E' possibile? Non sono io che scelgo come aprire i file?
Leo

 Leo
Per curiosità, puoi postare il link al codice sorgente di questo script 
Perl?



Si, ecco il link:
http://www.camilorocca.it/aruba-upload.txt
Ciao, Leo

 Ciao, Leo
Ciao,
hai notato qualche errore o qualcosa che sia possibile modificare?
Leo

MrPink wrote:

Di errori/cattive pratiche ce ne sono alcuni, ma nulla che riguardi (con 
certezza) il problema che hai riferito.
Inoltre, come considerazione di carattere generale, questo meccanismo 
dello script php che va a leggersi il file delle statistiche mentre lo 
script Perl lo aggiorna, mi sembra estremamente macchinoso e prono a 
diversi problemi: se invece la progress bar (ovvero l'html 
corrispondente) venisse generata direttamente dallo script Perl, tutto 
sarebbe molto più semplice e funzionale...
Comunque possiamo tentare un paio di modifiche (che poi sono esattamente 
i suggerimenti di Flavio).
1.
Prova ad attivare l'autoflushing sul file STATS: subito dopo la riga 
open(STATS, ...) metti:
my $ofh = select STATS; $| = 1; select $ofh;
sempre che tu non l'abbia già provato, come sembrerebbe dalle righe 
commentate all'interno del ciclo while (però quella roba doveva andare 
fuori dal ciclo; per i nostri scopi in realtà non sarebbe rilevante, ma 
per chi ci legge e sta imparando il Perl...)
In ogni caso prova come ho detto io, visto che non costa niente.
2.
Se non va, chiudi e riapri il file ogni volta come detto da Flavio, 
ovvero commenta la open(STATS, ...) (ed anche l'autoflush di cui al 
punto precedente) fuori dal ciclo, poi commenta anche le due
seek(STATS, ...) dentro al ciclo e alla fine dello script, e infine 
sostituisci ognuna delle due print STATS ..., (quella dentro al ciclo e 
quella alla fine dello script) con le seguenti 3 linee:
open( STATS, '>', "$statsfile" ) or print "can't open stat file";
print STATS "$percent\n$percentEst\n$estimate\n$estTime\n$len\n\n";
close STATS;
(in realtà l'ultima delle due print deve essere:
print STATS "100\n$percentEst\n$estimate\n$estTime\n$len\n";
)
3.
Se ancora non va, dopo ognuna delle due "close STATS;" inserite in 
precedenza, metti la seguenre linea:
sleep 2;
(questo in produzione andrà necessariamente tolto, ma per provare può 
essere utile.)
Infine, il codice Perl che hai postato è incompleto: servirebbe quello 
completo o gli eventuali altri file contenenti codice Perl 
(conf.uploader sospetto). Ed anche il codice php e l'eventuale html e 
javascript. E' sufficiente postare il link da cui hai scaricato il tutto.
Il codice Perl è piuttosto scadente e, come già detto, anche la 
strategia mi sembra molto discutibile, per cui ti consiglierei di 
orientarti su altre soluzioni (ce ne sono diverse basate su php+Perl) 
ma, arrivati a questo punto, siamo curiosi di appurare la veridicità di 
quanto affermato da Aruba ;-)
(Se le spiegazioni sugli interventi da fare non fossero chiare e 
preferissi delle patch, fammi sapere).

 Se non va, chiudi e riapri il file ogni volta come detto da Flavio,
Purtroppo anche qui poca fortuna. Ho provato anche con sleep 6 (se fosse 
vero il discorso del lock php dovrebbe riuscire a leggere il file STATS 
solo mentre è chiuso)
Ho fatto una prova che probabilmente avvalora quanto detto da aruba. Ho 
provato a listare il contenuto della directory di upload con FTP mentre 
era in corso un upload: vuota! Non risultava presente nemmeno il file in 
corso di upload.
E' la prova definitiva che devo gettare la spugna?
PS: il filemanager a cui appartiene lo script perl si chiama relay
Ciao, Leo

> 
Questa è la soluzione!
Purtroppo avevo fatto confusione portando online delle vecchie versioni 
di file che avevo in locale.
Forzando il flush del buffer funziona!!! La risposta di aruba nei post 
precedenti quindi è una (lo posso dire?) una CAZZATA!!!
Ok, finito lo sfogo.
Grazie a tutti per il tempo che mi avete dedicato
Ciao, Leo

 Grazie a tutti per il tempo che mi avete dedicato
Grazie a te per averci informato dell'esito: potrà tornare utile a chi 
dovesse avere gli stessi problemi in futuro.
Ciao.