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_abort
jeFALSE
ve výchozím nastavení, ale můžete použít nestandardní nastavení. Změňte toto nastavení zpět naFALSE
ve vásphp.ini
nebo 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
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.
- 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.