sql >> Database >  >> RDS >> Mysql

Openstaande AJAX-verzoeken annuleren in PHP-app?

Waarschijnlijke causale keten

  1. de server realiseert zich niet dat de XHR-verzoeken zijn geannuleerd, en dus blijven de bijbehorende PHP-processen draaien
  2. deze PHP-processen gebruiken sessies en voorkomen gelijktijdige toegang tot deze sessie totdat ze worden beëindigd

Mogelijke oplossingen

Het aanpakken van een van de bovenstaande twee punten verbreekt de ketting en kan het probleem oplossen:

  1. (a) ignore_user_abort is FALSE standaard, maar het kan zijn dat u een niet-standaard instelling gebruikt. Verander deze instelling terug naar FALSE in jou php.ini of bel ignore_user_abort(false) in de scripts die deze onderbreekbare verzoeken afhandelen.

Nadeel:het script wordt gewoon beëindigd. Werk in uitvoering wordt afgebroken, waardoor het systeem mogelijk vuil blijft.

  1. (b) Standaard zal PHP niet detecteren dat de gebruiker de verbinding heeft afgebroken totdat een poging wordt gedaan om informatie naar de client te sturen. Doe echo regelmatig iets in de loop van je langlopende script.

Nadeel:deze dummy-gegevens kunnen de normale uitvoer van uw script beschadigen. En ook hier kan het script het systeem in een vuile staat achterlaten.

  1. Een PHP-sessie wordt als een bestand op de server opgeslagen. Op session_start() , opent het script het sessiebestand in de schrijfmodus, waardoor het effectief een exclusieve vergrendeling krijgt. Volgende verzoeken die dezelfde sessie gebruiken, worden in de wacht gezet totdat de vergrendeling wordt vrijgegeven. Dit gebeurt wanneer het script wordt beëindigd, tenzij u de sessie expliciet sluit. Bel session_write_close() of session_abort() zo vroeg mogelijk.

Nadeel:wanneer gesloten, kan de sessie niet meer worden geschreven (tenzij u de sessie opnieuw opent , maar dit is een enigszins onelegante hack). Ook blijft het script draaien, waardoor mogelijk bronnen worden verspild.

Ik raad zeker de laatste optie aan.



  1. Een PHP PDO-verbinding krijgen van een mysql_connect()?

  2. Het geheugengebruik van MySQL-resultaten begrijpen in PHP (PDO)

  3. Onjuiste syntaxis in de buurt van het trefwoord 'met'...vorige instructie moet worden afgesloten met een puntkomma

  4. Introductie van de Easysoft Oracle® Driver in uw SOA-omgeving