Вывести "searching..." пока идет поиск

Tn

Guest
Вывести "searching..." пока идет поиск

Задача: вывести страницу "подождите пока запущен процес поиска". Как поиск по БД будет завершен, выдать результаты.
Т.е. нужен алгоритм как на этом форуме при поиске, но я его не понимаю :(

Что тут происходит? Видимо, запускается скрипт поиска как паралельный процес (fork?), и идет выдача страницы с сообщением "ждите..", которая, обновляясь каждую секунду, проверяет завершился ли поиск. Процесс поиска, видимо, пишет во временную таблицу БД свои результаты и, в конце концов, информацию, что поиск завершен. Когда ежесекундно запускаемый скрипт "ждите.." видит, что всё готово, выдаёт пользователю результаты.

Даже не знаю, насколько правильно я всё понимаю?
Как потом удаляется эта временная таблица? Через какой-то установленный промежуток времени или по каким-то другим критериям?
 

Profic

just Profic (PHP5 BetaTeam)
Нет никакого алгоритма
Эта страница показывается всегда константное кол-во времени.
При этом запрос на поиск записывается в таблицу, а при редиректе считывается и выполняется
 

Alexandre

PHPПенсионер
подход 1 - использовать Буферизацию php.net/ob_start


подход 2 - использовать Redirect. т.е. Header('Location: xxxx')
выводится первая страница "Запущен поиск"
и запускается страница "Вывод результатов поиска"
пока отрабатывает второй скрипт, Юзверь видит первую страницу.
 

Фанат

oncle terrible
Команда форума
Profic
но тем не менее, описанный вариант так же осуществим.
Как и некоторые другие, хотя там уже отличается в деталях - например, перегружается не вся странитса, а ифрейм
 

Profic

just Profic (PHP5 BetaTeam)
Фанат
Все возможно, но однако непонятно зачем вообще оно нужно.
Чтобы проявить заботу о пользователе - достаточно константной задержки.
Все равно поиск, какой бы он не был ИМХО должен выполняться в пределах стандартных задержек инета.
 

SiMM

Новичок
Зачем вообще эта задержка? Если поиск выполняется ТАК долго, то не разумнее ли заняться оптимизацией запросов?
 

Tn

Guest
Автор оригинала: SiMM
Зачем вообще эта задержка? Если поиск выполняется ТАК долго, то не разумнее ли заняться оптимизацией запросов?
Поиск идет по двум таблицам с очень большим числом записей и большим количеством полей (по каждому полю).
Возможно, разумнее занятся оптимизацией и если вы подскажете что-то полезное, буду признателен.
Запрос стандартный: SELECT * FROM .... WHERE (field1 like '%$search%') or (field2 like '%$search%') or ...
В целях оптимизации, в голову приходит добавить в таблицу поле blob, куда дублировать через пробел все поля в записи (дальше придется искать только по этому - одному полю). Проверял, это работает в 2-3 раза быстрее, но и размер таблицы естественно растёт. Из двух зол выбираю меньшее, но не могу определиться, что это меньшее..

-~{}~ 19.01.05 16:22:

Объясните, пожалуйста, какой смысл в этой промежуточной странице "Ждите, идет поиск", на этом сайте? Задержать выдачу информации на 1 секунду?

-~{}~ 19.01.05 16:54:

Всё ясно, вопрос закрыт.
 

Wicked

Новичок
Еще один метод: можно выдать браузеру некоторую шапку с надписью "Ждите" (но не заканчивать вывод страницы, чтобы держать браузер) и дальше производить поиск этим же скриптом, складывая результаты во временное хранилище. Когда поиск закончился, кидаем вдогонку браузеру код жабаскрипа, который его редиректит на результат.

+ время ожидания точно соответствует времени поиска
+ меньше редиректов
- использование js
- при очень долгом поиске браузер может отвалиться
 

Tn

Guest
Не факт, что эта шапка отобразится пока не закончился вывод страницы.
 

Wicked

Новичок
ну да, точной гарантии дать нельзя... но поспособствовать этому немного можно :)
сделать шапку > 256bytes, flush(), ob_flush()...
 

Insider [2-D]

Guest
2 Wicked:
> - при очень долгом поиске браузер может отвалиться
ЛОЛ! :+) "браузер может отвалиться" - я пЛакаЛ.. .))))
 

Screjet

Новичок
Подобный алгоритм вообще удобен при длительных операциях, принцип представляю таким:
некий демон, получает команды от скрипта, выполняет полезную работу.
В это время скрипт отображает "ждите" и указан meta refresh, (условно, скажем) который рефрешит страницу каждые 10 сек. В период запроса проверяет факт готовности результата демона: если результат есть = выводим, если нет, продолжает выводить "ждите" (с meta refresh).
 
Сверху