Ignore user abort PHP scripts

2008-02-01 | Tags: ,

Scusate il titolo in inglese, ma esprimerlo in italiano sarebbe stato troppo lungo.

Cosa succede quando un client richiede una risorsa (documento HTML, PDF, MP3 o qualsiasi altra cosa) ad un server? Il server elabora la richiesta del client e, se possibile, invia le informazioni richieste al client richiedente. Tutto questo è gestito dai vari protocolli TCP/IP e HTTP, ma non scendiamo troppo nel dettaglio.

Se siete a digiuno di protocolli e volete maggiori informazioni, una lettura a questo recente articolo non può fare che bene.

Cosa succede se il client richiede una risorsa che incorpora codice server-side (PHP, .NET, JSP o qualsiasi altro linguaggio)? Al passaggio prima descritto si aggiunge un ulteriore step. Questo step è quello necessario all’elaborazione degli script all’interno del documento; questo processo è gestito dal server application.

Cosa succede, nel primo caso, se prima di ricevere la risposta dal server, la comunicazione viene interrotta (ad esempio chiudendo il client, la connessione o interrompendo la comunicazione)? Semplice, il protocollo di comunicazione si accorge che è stata interrotta per cui fa sapere che può lasciar cadere la richiesta, visto che non c’è più nessuno ad aspettare la risposta.

Ma cosa succede se il documento è in fase di elaborazione da parte del server application, come ipotizzato nel secondo caso?

Praticamente la stessa cosa: l’elaborazione viene interrotta e scartata.

Se ci troviamo difronte a script “normali”, l’elaborazione da parte del server application è talmente rapida che è praticamente impossibile bloccare tale elaborazione, per cui lo script va a buon fine sebbene non ci sarà un client ad attendere la risposta.

Ma proviamo ad immaginare il caso in cui il nostro script deve eseguire operazioni complesse, magari elaborazioni su tabelle di database complesse. Questo farà si che il nostro script richieda tempi di elaborazione più lenti. Cosa succede se lo script viene interrotto a causa di un abort causato da un client?

Ovviamente uno sviluppatore creerà sistemi di rollback che terranno sotto controllo questa eventualità. Ma se volessimo fare in modo che l’esecuzione di determinati script continui anche nel caso di disconnessione o, in generale, di abort sollevati da un client?

La soluzione PHP si chiama ed è una funzione da inserire all’interno dello script da rendere “immortale”.

La funzione si aspetta un valore booleano e non restituisce nessun risultato se non il valore precedentemente impostato.

Questa può essere una funzione molto utile per simulare esecuzioni in background, per realizzare script di normalizzazione di dati, per creare script che rimuovono file obsoleti o temporanei.

Ovviamente gli scenari possono essere molti!

  1. 1 trackbacks
    1. 2008-02-01 - diggita.it