Вероятна причинно-следствена верига
- сървърът не осъзнава, че XHR заявките са анулирани и затова съответните PHP процеси продължават да работят
- тези PHP процеси използват сесии и предотвратяват едновременния достъп до тази сесия, докато не бъдат прекратени
Възможни решения
Обръщането към някоя от горните две точки прекъсва веригата и може да реши проблема:
- (a)
ignore_user_abortкод>
еFALSE
по подразбиране, но може да използвате нестандартна настройка. Променете тази настройка обратно наFALSE
във васphp.ini
или се обадете наignore_user_abort(false)
в скриптовете, които обработват тези прекъсваеми заявки.
Недостатък:скриптът просто се прекратява. Всяка работа в ход се прекратява, което вероятно оставя системата в мръсно състояние.
- (b) По подразбиране PHP няма да открие, че потребителят е прекъснал връзката, докато не бъде направен опит за изпращане на информация до клиента. Направете
ехо
нещо периодично по време на дългогодишния ви скрипт.
Недостатък:тези фиктивни данни може да повредят нормалния изход на вашия скрипт. И тук скриптът може да остави системата в мръсно състояние.
- PHP сесиите се съхраняват като файл на сървъра. На
session_start()
, скриптът отваря файла на сесията в режим на запис, ефективно придобивайки ексклузивно заключване за него. Следващите заявки, които използват същата сесия, се задържат, докато заключването не бъде освободено. Това се случва, когато скриптът приключи, освен ако не затворите сесията изрично. Обадете се наsession_write_close()
илиsession_abort()
възможно най-рано.
Недостатък:когато е затворена, сесията не може да бъде записана повече (освен ако не отворите отново сесията , но това е малко неелегантен хак). Също така скриптът продължава да работи, което вероятно губи ресурси.
Определено препоръчвам последния вариант.