Prawdopodobny łańcuch przyczynowy
- serwer nie zdaje sobie sprawy, że żądania XHR są anulowane, więc odpowiednie procesy PHP nadal działają
- Te procesy PHP używają sesji i uniemożliwiają równoczesny dostęp do tej sesji, dopóki się nie zakończą
Możliwe rozwiązania
Adresowanie jednego z powyższych dwóch punktów przerywa łańcuch i może rozwiązać problem:
- (a)
ignore_user_abort
jestFAŁSZ
domyślnie, ale możesz używać niestandardowego ustawienia. Zmień to ustawienie z powrotem naFALSE
w tobiephp.ini
lub zadzwońignore_user_abort(false)
w skryptach obsługujących te przerywane żądania.
Wada:skrypt po prostu się kończy. Wszelkie prace w toku są porzucane, co prawdopodobnie pozostawia system w stanie brudnym.
- (b) Domyślnie PHP nie wykryje, że użytkownik przerwał połączenie, dopóki nie zostanie podjęta próba wysłania informacji do klienta. Wykonaj
echo
coś okresowo w trakcie twojego długotrwałego skryptu.
Wada:te fałszywe dane mogą uszkodzić normalne wyjście twojego skryptu. Również tutaj skrypt może pozostawić system w stanie brudnym.
- Sesje PHP są przechowywane jako plik na serwerze. W
session_start()
, skrypt otwiera plik sesji w trybie zapisu, skutecznie uzyskując na nim blokadę na wyłączność. Kolejne żądania korzystające z tej samej sesji są wstrzymywane do czasu zwolnienia blokady. Dzieje się tak, gdy skrypt kończy działanie, chyba że jawnie zamkniesz sesję. Zadzwońsession_write_close()
lubsession_abort()
tak wcześnie, jak to możliwe.
Wada:po zamknięciu sesji nie można już zapisać (chyba że ponownie otworzysz sesję , ale jest to trochę nieelegancki hack). Skrypt również działa, prawdopodobnie marnując zasoby.
Zdecydowanie polecam ostatnią opcję.