Probabile catena causale
- il server non si rende conto che le richieste XHR sono state cancellate, quindi i processi PHP corrispondenti continuano a funzionare
- questi processi PHP utilizzano sessioni e impediscono l'accesso simultaneo a questa sessione finché non vengono terminate
Possibili soluzioni
Affrontare uno dei due punti precedenti interrompe la catena e potrebbe risolvere il problema:
- (a)
ignore_user_abort
èFALSE
per impostazione predefinita, ma potresti utilizzare un'impostazione non standard. Riporta questa impostazione suFALSE
in tephp.ini
oppure chiamaignore_user_abort(false)
negli script che gestiscono queste richieste interrompibili.
Svantaggio:lo script è appena terminato. Qualsiasi lavoro in corso viene eliminato, probabilmente lasciando il sistema in uno stato sporco.
- (b) Per impostazione predefinita, PHP non rileverà che l'utente ha interrotto la connessione fino a quando non viene effettuato un tentativo di inviare informazioni al client. Esegui
echo
qualcosa periodicamente nel corso del tuo script di lunga durata.
Svantaggio:questi dati fittizi potrebbero danneggiare il normale output del tuo script. E anche qui, lo script potrebbe lasciare il sistema in uno stato sporco.
- Una sessione PHP viene archiviata come file sul server. Su
session_start()
, lo script apre il file di sessione in modalità di scrittura, acquisendo di fatto un lock esclusivo su di esso. Le richieste successive che utilizzano la stessa sessione vengono messe in attesa fino al rilascio del blocco. Ciò accade quando lo script termina, a meno che non si chiuda la sessione in modo esplicito. Chiamasession_write_close()
osession_abort()
il prima possibile.
Svantaggio:una volta chiusa, la sessione non può più essere scritta (a meno che tu non riapra la sessione , ma questo è un trucco poco elegante). Inoltre lo script continua a funzionare, probabilmente sprecando risorse.
Consiglio vivamente l'ultima opzione.