Sandsynlig årsagskæde
- serveren er ikke klar over, at XHR-anmodningerne er annulleret, og derfor kører de tilsvarende PHP-processer
- disse PHP-processer bruger sessioner og forhindrer samtidig adgang til denne session, indtil de afsluttes
Mulige løsninger
Adressering af et af de to ovenstående punkter bryder kæden og kan løse problemet:
- (a)
ignore_user_abort
erFALSK
som standard, men du bruger muligvis en ikke-standardindstilling. Skift denne indstilling tilbage tilFALSK
i digphp.ini
eller ring tilignore_user_abort(false)
i de scripts, der håndterer disse afbrydelige anmodninger.
Ulempe:scriptet afsluttes bare. Ethvert igangværende arbejde droppes, hvilket muligvis efterlader systemet i en snavset tilstand.
- (b) Som standard vil PHP ikke registrere, at brugeren har afbrudt forbindelsen, før der er gjort et forsøg på at sende information til klienten. Udfør
echo
noget med jævne mellemrum i løbet af dit langvarige script.
Ulempe:disse dummy-data kan ødelægge det normale output af dit script. Og også her kan scriptet efterlade systemet i en beskidt tilstand.
- En PHP-session er gemt som en fil på serveren. På
session_start()
, åbner scriptet sessionsfilen i skrivetilstand og opnår effektivt en eksklusiv lås på den. Efterfølgende anmodninger, der bruger den samme session, sættes i bero, indtil låsen udløses. Dette sker, når scriptet afsluttes, medmindre du eksplicit lukker sessionen. Ring tilsession_write_close()
ellersession_abort()
så tidligt som muligt.
Ulempe:når den er lukket, kan sessionen ikke længere skrives (medmindre du genåbner sessionen , men dette er noget uelegant et hack). Også scriptet bliver ved med at køre, hvilket muligvis spilder ressourcer.
Jeg anbefaler klart den sidste mulighed.