Trolig orsakskedja
- servern inser inte att XHR-förfrågningarna har avbrutits, och därför fortsätter motsvarande PHP-processer att köras
- dessa PHP-processer använder sessioner och förhindrar samtidig åtkomst till denna session tills de avslutas
Möjliga lösningar
Att adressera någon av ovanstående två punkter bryter kedjan och kan lösa problemet:
- (a)
ignore_user_abort
ärFALSK
som standard, men du kan använda en icke-standardinställning. Ändra tillbaka den här inställningen tillFALSK
i digphp.ini
eller ringignore_user_abort(false)
i skripten som hanterar dessa avbrottsbara förfrågningar.
Nackdel:skriptet avslutas bara. Allt pågående arbete avbryts, vilket möjligen lämnar systemet i ett smutsigt tillstånd.
- (b) Som standard kommer PHP inte att upptäcka att användaren har avbrutit anslutningen förrän ett försök görs att skicka information till klienten. Gör
echo
något med jämna mellanrum under loppet av ditt långa manus.
Nackdel:denna dummydata kan förstöra den normala utmatningen av ditt skript. Och även här kan skriptet lämna systemet i ett smutsigt tillstånd.
- En PHP-session lagras som en fil på servern. På
session_start()
, öppnar skriptet sessionsfilen i skrivläge, vilket effektivt får ett exklusivt lås på den. Efterföljande förfrågningar som använder samma session parkeras tills låset släpps. Detta händer när skriptet avslutas, såvida du inte stänger sessionen uttryckligen. Ringsession_write_close()
ellersession_abort()
så tidigt som möjligt.
Nackdel:när den är stängd kan sessionen inte skrivas längre (såvida du inte öppnar sessionen igen , men det här är något oelegant hack). Skriptet fortsätter också att köras, vilket kan slösa med resurser.
Jag rekommenderar definitivt det sista alternativet.