Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Anulować oczekujące żądania AJAX w aplikacji PHP?

Prawdopodobny łańcuch przyczynowy

  1. serwer nie zdaje sobie sprawy, że żądania XHR są anulowane, więc odpowiednie procesy PHP nadal działają
  2. 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:

  1. (a) ignore_user_abort jest FAŁSZ domyślnie, ale możesz używać niestandardowego ustawienia. Zmień to ustawienie z powrotem na FALSE w tobie php.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.

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

  1. 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() lub session_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ę.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sprawdzić, czy zapytanie MySQL UPDATE nie powiedzie się, ponieważ dostarczane informacje są zgodne z danymi już w bazie danych?

  2. Jak korzystać z JdbcTemplate firmy Spring, aby połączyć się z prostą bazą danych MySql?

  3. wybrani użytkownicy mają więcej niż jeden odrębny rekord w mysql

  4. połączenie z bazą danych php singleton, czy ten kod jest złą praktyką?

  5. prawidłowy sposób wstawiania danych o id jako auto-inkrementacji w mysqli