Допустим, вы создаете новый уникальный сервис по поиску дешевых авиабилетов ;)
Интерфейс
1. Пользователь заходит на страницу вашего сервиса, выбирает направление (city) и дату вылета (date), нажимает Найти.
2. Оправляется AJAX POST запрос на /search.php {city, date}, который возвращает ID запроса (request_id).
3. Каждые 1-5 секунд отправляется AJAX GET запрос на /search.php?check=request_id, который возвращает процент готовности ответа (0-100%).
4. Когда готовность достигает 100%, отправляется AJAX GET запрос на /search.php?result=request_id который возвращает информацию о найденных билетах.
/search.php
1. Создание очереди заданий на запрос к авиакомпаниям
- создание ID запроса
$request_id = INSERT INTO `request` (`city`, `date`) VALUES (city, date);
- создание очереди заданий на получение информации по билетам
INSERT INTO `request_task` (`request_id`, `airline_id`, `status`) VALUES (request_id, 1, 0);
INSERT INTO `request_task` (`request_id`, `airline_id`, `status`) VALUES (request_id, 2, 0);
INSERT INTO `request_task` (`request_id`, `airline_id`, `status`) VALUES (request_id, 3, 0);
INSERT INTO `request_task` (`request_id`, `airline_id`, `status`) VALUES (request_id, 4, 0);
2. Проверка готовности ответа
SELECT COUNT(*) FROM `request_task` WHERE `request_id` = request_id AND `status` > 0;
3. Информация о найденных билетах
SELECT * FROM `request_result` WHERE `request_id` = request_id
/task.php
Суть: выбрать из очереди заданий одну задачу и выполнить ее. Скрипт нужно запускать несколько раз в секунду в зависимости от нагрузки на сервис
1. Забронировать задачу на выполнение
$process = ip2long($_SERVER['SERVER_ADDR']).'.'.getmypid().'.'.microtime(TRUE);
UPDATE `request_task` SET `process` = $process WHERE `status` = 0 LIMIT 1;
2. Получить забронированную задачу
SELECT * FROM `request_task` WHERE `process` = $process
3. Обратится к нужной авиакомпании
if (airline_id == 1) запрос к Аэрофлоту
4. Положить результат обращения в `request_result`
5. UPDATE `request_task` SET `process` = 0, `status` = 1 WHERE `process` = $process
Таким образом реализуется многопоточность!