sql >> Databáze >  >> RDS >> Mysql

Zrušit čekající požadavky AJAX v aplikaci PHP?

Pravděpodobný kauzální řetězec

  1. server si neuvědomuje, že požadavky XHR byly zrušeny, a tak příslušné procesy PHP stále běží
  2. tyto procesy PHP používají relace a zabraňují souběžnému přístupu k této relaci, dokud se neukončí

Možná řešení

Adresování kteréhokoli z výše uvedených dvou bodů přeruší řetězec a může problém vyřešit:

  1. (a) ignore_user_abort je FALSE ve výchozím nastavení, ale můžete použít nestandardní nastavení. Změňte toto nastavení zpět na FALSE ve vás php.ini nebo zavolejte ignore_user_abort(false) ve skriptech, které zpracovávají tyto přerušitelné požadavky.

Nevýhoda:skript se právě ukončí. Jakákoli nedokončená práce bude zrušena, což může způsobit, že systém zůstane ve špinavém stavu.

  1. (b) Ve výchozím nastavení PHP nezjistí, že uživatel přerušil připojení, dokud se nepokusí odeslat informaci klientovi. Proveďte echo něco pravidelně v průběhu vašeho dlouhotrvajícího skriptu.

Nevýhoda:tato fiktivní data mohou poškodit normální výstup vašeho skriptu. A i zde může skript opustit systém ve špinavém stavu.

  1. Relace PHP jsou uloženy jako soubor na serveru. Na session_start() , skript otevře soubor relace v režimu zápisu a efektivně na něj získá výhradní zámek. Následné požadavky, které používají stejnou relaci, jsou pozastaveny, dokud se zámek neuvolní. K tomu dojde, když se skript ukončí, pokud relaci výslovně neuzavřete. Zavolejte session_write_close() nebo session_abort() co nejdříve.

Nevýhoda:po zavření již nelze relaci zapisovat (pokud relaci znovu neotevřete , ale to je poněkud nevkusný hack). Skript také stále běží, což možná plýtvá zdroji.

Rozhodně doporučuji poslední možnost.



  1. Funkce NULLIF() v Oracle

  2. Načíst TOP 10 řádků bez použití TOP nebo LIMIT? – Otázka týdne v rozhovoru č. 247

  3. Jak uložit textový řetězec se zalomením řádků do textového pole databáze MySQL pomocí PHP?

  4. Spring Boot + docker-compose + MySQL:Připojení odmítnuto