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


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

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

Заранее спасибо за ваши ответы.

4 13

4 ответа:

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

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

  1. сессии
  2. открыть sql-соединение
  3. если параметр search_connection_id установлен в сеансе, отключите соединение
  4. Найдите свой идентификатор соединения, сохраните в сеансе как search_connection_id
  5. закройте сеанс-важно, иначе следующий запрос будет заблокирован на шаге 1
  6. база данных запросов
  7. Если соединение разорвано, это еще один поиск, убивающий вас в шаге 3, Выход
  8. открыть сеанс, удалить search_connection_id
  9. отправить ответ, закрыть sql соединение

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

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

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

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

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

После вызова ajax callback (success или error) вы можете установить isPending в false;

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

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