• Registrati
Benvenuto su codeinvaders.net la community italiana dedicata agli sviluppatori!
Puoi partecipare alle discussioni anche attraverso facebook, twitter e google+.
JS Day
  • google plus
  • facebook
  • twitter
Codeinvaders.net, domande e risposte per sviluppatori!
Partecipa a questa community rispettando tutti i suoi membri che, per il puro piacere di condividere, forniscono risposte e suggerimenti.
Classifica migliori utenti del mese 02/2017
  1. 4240 Punti

  2. 3980 Punti

  3. 3480 Punti

  4. Luca Rainone

    2400 Punti

I premi del mese
Posizione 1: Buono Amazon da 10 euro
Posizione 2: Sconto 40% su un libro O'Reilly

Errore durante upload di file via ftp

Premessa: gestisco alcuni siti/portali con un discreto numero di visitatori l'ora.

Il problema è che quando, quelle poche volte, aggiorno un file critico (come per esempio il file di configurazione, o una classe che viene inclusa in tutte le richieste) inevitabilmente dà errore a tutti i visitatori che, nell'arco di tempo dell'upload, hanno la sfortuna di richiedere una pagina. Questo è un problema macroscopico quando la connessione è lenta e un file impiega più di 5 secondi a caricarsi.

Possibile che non ci sia una gestione dell'upload più intelligente?
C'è qualche accortezza che posso utilizzare per prevenire o quanto meno limitare il danno?

Come client utilizzo FileZilla, ma credo sia un problema di come il server gestisce l'upload, vero?

EDIT: Purtroppo farlo a linea di comando via SSH è escluso perché posso non avere i diritti e l'accesso SSH. La cosa più ovvia è metter su un file temporaneo e poi andare a sostituirlo. Quel che mi chiedo è se c'è un modo per farlo fare al server ftp in automatico questo lavoro.

CHIARIMENTO: Non è un form in php. Il caso d'uso è l'aggiornamento via ftp (come client filezilla) un file di configurazione (per esempio delle costanti). Questo file viene praticamente incluso sempre e da tutti gli script, e quando devo aggiornarlo qualche visitatore online si becca un errore perché mentre l'ftp lo carica, il file non è disponibile (e il php non lo include, o lo include in modo parziale [devo ancora indagare perché non è semplice riprodurre l'errore] creando una serie di errori a catena). Non mi va di mettere il server "in manutenzione" per pochi secondi. Mi basterebbe un semaforo che faccia aspettare la richiesta finché il file non sia caricato. Se c'è un modo per evitare di fare questi check manualmente, sarebbe gradito :)

quesito posto 26 Novembre 2012 in php da Luca Rainone (2,400 punti)
modificato 27 Novembre 2012 da Luca Rainone
   

3 Risposte

+2 voti

perchè non lo carichi con un altro nome e poi via ssh non sovrascrivi quell'altro?

risposta inviata 27 Novembre 2012 da Alessandro Crugnola (230 punti)
Grazie per la risposta :) Vedi il mio edit. (la tua soluzione può anche andar bene senza usare l'ssh) +1
0 voti

se usi un form php per l'upload, praticamente fa tutto da solo, prima crea un file temporaneo, a upload completato si sposta in sede ed eventualmente si sovrascrive.

Devo rilevare una cosa pero', che senso ha voler garantire che un file sia SEMPRE on-line anche quando da li' a qualche secondo risultera' obsoleto?

Io implementerei un feedback per l'utente, del tipo "stiamo aggiornando la risorsa, riprovare piu' tardi", o con dei timer, insomma di modi ce ne sono tanti.

:)
Jaco

risposta inviata 27 Novembre 2012 da anonimo
Non è un form php. Parlo di un semplice upload di un file via ftp. Il tag php c'è perché quando qualcuno chiama quella pagina mentre è in upload, c'è proprio un errore php (a me interessa evitare quello in qualche modo) :-)
+1 voto

Un'opzione è di creare un tar con tutti file modificati creato partendo dalla root del progetto (ci sono script che permettono di farlo usando revision differenti in SVN/GIT e immagino anche per HG o altri sistemi di versioning), a questo punto una volta caricato sul server procedere con un untar che sostituisca in maniera puntuale tutti i file.

Altra opzione (legata al tipo di applicativo che stai considerando) è di forzare il caching in modo da rendere "non considerabile" il cambiamento del file, ad esempio, in PHP puoi forzare ad usare APC per ignorare i cambiamenti del file e tenere l'OPCode in memoria. A questo punto (ipoteticamente) una volta che la cache dell'OPCode è caricata potresti anche cancellare i file e l'applicazione continuerebbe a funzionare. In questo caso puoi sostituire i file e solo a questo punto forzare l'APC a cancellare l'OPCode e ricrearlo dai file.

NB: FTP è un pessimo modo per trasferire file, non c'è controllo di checksum, non c'è nessuna garanzia che arrivi dall'altra parte "sano e salvo".

risposta inviata 27 Novembre 2012 da anonimo

FTP è un pessimo modo per trasferire file...

Quindi suggerisci di usare la linea di comando?

In ambienti di produzione sicuramente.. FTP è tropo fragile come protocollo di trasferiemnti di file, va benissimo per file di grosse dimensioni e poco critici (il fatto che i pacchetti vengano "accettati" senza troppi controlli fa si che la velicità di trasferimento sia più alta), ma se fallisce non si nota fino a che è troppo tardi :)
Puoi partecipare alle discussioni anche attraverso facebook e twitter.
...