Mysql
 sql >> Database >  >> RDS >> Mysql

Annullare le richieste AJAX in sospeso nell'app PHP?

Probabile catena causale

  1. il server non si rende conto che le richieste XHR sono state cancellate, quindi i processi PHP corrispondenti continuano a funzionare
  2. 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:

  1. (a) ignore_user_abort è FALSE per impostazione predefinita, ma potresti utilizzare un'impostazione non standard. Riporta questa impostazione su FALSE in te php.ini oppure chiama ignore_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.

  1. (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.

  1. 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. Chiama session_write_close() o session_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.