LINUX.ORG.RU

Как остановить поиск в БД при уходе юзера со страницы поиска

 ,


0

1

Предположим такую ситуацию что юзер делает поиск в большой таблице который может в некоторых случаях потребовать длительного времени. Если во время поиска юзер закрывает браузер если посмотреть вывод `top` видно что postgresql продолжает поиск по запросу. Хотелось бы в таких случаях остановить поиск в postgresql т.к. данные всё равно некуда будет выводить и эта пустая трата ресурсов. Возможно ли это как то реализовать. Если не удастся детектить закрытие браузером TCP соединения хотелось бы хотя бы сделать кнопку «Cancel» для юзера чтоб он мог отменить медленный запрос и переформулировать запрос по другому. Используется PHP+Postgresql.


тут написано, как остановить запрос. Чтобы определить, что пользователь закрыл страницу, проще всего со страницы дёргать раз в секунду что-нибудь на сервере. Соответственно если в течение нескольких секунд это что-нибудь не дёргалось, значит пользователь закрыл страницу. Также можешь попробовать ловить события onbeforeunload, onunload, но это когда пользоавтель сам закрыл страницу, а не интернет у него отвалился, например.

А вообще если поиск, например, через AJAX делается синхронно, можешь на сервере тупо отслеживать статус соединения. Разорвано соединение — останавливай запрос и всё, результаты слать-то некуда.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

дёргать раз в секунду что-нибудь на сервере

Фу так говнокодить

интернет у него отвалился

Интернет потом привалиться может, и это не повод оставаться без результата

Goury ★★★★★
()

Сделай через очередь. Грубо говоря:

  • юзер формирует запрос, шлёт его серверу для обработки
  • серверная часть начинает его выполнять, получает его id из посгреса, делает запись в сессии вида «$user <=> $pgid», и говорит юзеру «запрос поставлен в очередь»
  • с этого момента, пока запрос не завершился, юзеру должна показываться страничка «запрос ещё выполняется, отменить»
  • когда запрос выполнен - сохранить результат куда-нибудь, показать юзеру ссылку на результат
  • см п. 1
anonymous
()

Держи открытым вебсокет, когда сокет закрывается - значит закрыл подлый пользователь твой славный сайт и можно грохнуть запрос. Как его грохнуть - выше уже отписали. Ну и кнопка «Отменить» нехай в тот же сокет пропихивает данные, ну и грохнуть запрос ты можешь ровно так же.

Balantay
()
Ответ на: комментарий от Legioner

В PHP как то можно отследить то что соединение браузер закрыл? Я вообще не понимаю почему скрипт не терминируется при этом, а следовательно и соединение с БД должно закрываться и соответственно прекращаться обработка запроса в БД.

iluha16
() автор топика
Ответ на: комментарий от iluha16

соединение с БД должно закрываться и соответственно прекращаться обработка запроса в БД.

Из первого совершенно не следует второе. Чтобы узнать что соединение закрыто нужно попробовать что-то прочитать или записать в сокет и получить ошибку. Когда postgres выполняет запрос, он ничего не читает и не пишет в сокет и соответственно не может узнать что соединение уже закрылось и можно прекратить выполнение запроса.

У вас проблема с архитектурой, долгие отчёты так не делают, их делают через очередь, см. что выше писал аноним.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.