Pravděpodobný kauzální řetězec
- server si neuvědomuje, že požadavky XHR byly zrušeny, a tak příslušné procesy PHP stále běží
- 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:
- (a)
ignore_user_abortjeFALSEve výchozím nastavení, ale můžete použít nestandardní nastavení. Změňte toto nastavení zpět naFALSEve vásphp.ininebo zavolejteignore_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.
- (b) Ve výchozím nastavení PHP nezjistí, že uživatel přerušil připojení, dokud se nepokusí odeslat informaci klientovi. Proveďte
echoně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.
- 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. Zavolejtesession_write_close()nebosession_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.