2013-05-29 3 views
11

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

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

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

+1

Вы можете ограничить число символов, которое нужно заполнить в поле поиска, или когда оно появляется в окне поиска, и типы, которые вы ищете там с помощью jQuery ajax. – Rafee

+1

Вам следует начать поиск, если только пользователь нажал кнопку «Поиск» или нажал клавишу ввода. –

+3

Если вы занимаетесь поиском по поисковым запросам, что процесс отстает от сервера при его запуске несколько раз, вам нужно оптимизировать свои поисковые процедуры, а не пытаться убить уже запущенные процессы. Поместите ключ в столбец поиска, и для получения результатов нужно взять доли секунды. – Anigel

ответ

3
+0

читайте примечание: PHP не обнаружит, что пользователь прервал соединение до тех пор, пока не будет предпринята попытка отправить информацию клиенту. И значение по умолчанию уже неверно. – Marek

0

Существует одно решение, которое я выяснил сейчас.

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

После Ajax обратного вызова вызывается (успех или ошибка) вы можете установить isPending к ложным;

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

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

+0

Ну, это не решит мою проблему, потому что она также отправляет на сервер несколько запросов. Таким образом, он отменяет запрос ajax, когда регистрируются новые данные, но процесс сервера продолжается до тех пор, пока сервер не настроен на это. –

3

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

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

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

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

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

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

Смежные вопросы