Как отменить процесс PHP, когда аннулирован вызов ajax?

В настоящее время я работаю над системой CRM с огромной базой данных. Если пользователь хочет выполнить поиск клиента, он может использовать поиск ajax. Каждый раз, когда он меняет что-то в поле поиска, пока вызов не выполняется, старый вызов отменяется, и новый сервер будет отправлен на сервер. Моя проблема заключается в том, что процессы php на стороне сервера продолжают работать. Поэтому, если пользователь начинает вводить адрес, запускается и отменяется несколько запросов, и серверу требуется больше времени для ответа.

Можно ли отменить текущий процесс php, когда отменяется вызов ajax? Или есть возможное решение на стороне сервера, чтобы определить, выполняется ли запрос поиска от одного и того же пользователя и отменить его перед запуском нового?

Заранее благодарим за ваши ответы.

Ответ 2

Ваш php сервера должен вывести что-то, чтобы обнаружить, что запрос отменен. Но поскольку вы, вероятно, выполняете длинный sql-запрос, вы ничего не можете выводить.

Но все же вы можете сохранить свой идентификатор соединения в сеансе и убить соединение, если оно обнаружено:

  • Открыть сеанс
  • Открыть SQL-соединение.
  • Если search_connection_id установлен в сеансе, убейте соединение
  • Найдите идентификатор соединения, сохраните сеанс как search_connection_id
  • Закройте сеанс - важно, иначе следующий шаг будет заблокирован на шаге 1
  • База данных запросов
  • Если соединение сломано, это другой поиск, убивающий вас на шаге 3, выйдите из
  • Открыть сеанс, удалить search_connection_id
  • Отправить ответ, закрыть sql-соединение.

Ответ 3

Есть одно решение, которое я выяснил сейчас.

Вы можете установить boolean isPending при отправке запроса ajax, вы можете установить это значение в true

После вызова ajax callback (успех или ошибка) вы можете установить isPending в false:

Кроме того, вы можете иметь строковую переменную searchContent и обновлять эту переменную при изменении текста. Поэтому, когда Ajax Call не находится в ожидании, а searchContent имеет контент, вы можете отправить другой вызов ajax.

Лучшим вариантом является использование уже написанного решения, например: http://jqueryui.com/autocomplete/, это очень просто, и он работает очень хорошо, он даже уже встроенная система кэширования.

Ответ 4

Спасибо всем за ваши ответы.

Я переработал свои поисковые запросы, как предположил Анигель, с подавляющим результатом.

Но я думаю, что правильные ответы на мой вопрос - ответы Марека и Харикришнана Вишванатара. Оба должны делать то, о чем я просил.