@Art4es

Как остановить выполнение php скрипта с помощью js?

Загружаю страницу, а после загрузки подтягиваю данные из бд с помощью xmlhttprequest. Бывает такое, что ответ от сервера приходится ждать более минуты, при этом уйти с этой страницы по клику на элемент навигации никак нельзя. Есть ли способ остановить выполнение php скрипта с помощью js?
Запрос асинхронный. Все события на элементах работают.
.abort() убивает запрос, но пока сервер не даст ответ, уйти со страницы нельзя.
Я так полагаю, что нужно как бы оборвать соединение с сервером, чтобы остановить выполнение скрипта, но как сделать это, не знаю.
  • Вопрос задан
  • 759 просмотров
Решения вопроса 1
megafax
@megafax
web-программист
У Вас, скорей всего, происходит классическая проблема с сессиями. Скрипт AJAX, хоть и асинхронный, занимает дескриптор работы с файлом сессии. И пока он его не закончит (окончание работы скрипта, либо через функцию) файл освобожден не будет и пользователь не сможет сделать любой другой запрос. Решений несколько:
1. Перевести работу с сессиями в бд/memcached/redis
2. Закрывать сессию после ее чтения и запись изменений делать в конце скрипта (если они есть).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
rework
@rework
Помог ответ? В благодарность отметь его решением
при этом уйти с этой страницы по клику на элемент навигации никак нельзя.


Почему нельзя уйти со страницы то?
Ответ написан
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
...подтягиваю данные из бд с помощью xmlhttprequest. Бывает такое, что ответ от сервера приходится ждать более минуты,..
на вашем месте при таком раскладе я бы в первую очередь разобрался с работой бд, которая отдает данные больше минуты. Это номер раз.
Второе - если там реально дохренища данных - бить на куски и делать несколько запросов, по окончании загрузки 1 куска стартовать второй и тд, так можно будет прервать работу на клиенте, а не на сервере, что гораздо проще как вы понимаете.
Вариант 3, при нагруженных вычислениях - запускать на сервере скрипт в отдельном потоке, результат писать в какое-либо хранилище (можно прям обратно в бд, но думаю редис для этого более подходящий вариант), запрашивать результат лонг поллингом или по таймеру через каждые н секунд.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы