А.З.ф.И.> Ну, понятно, но не вся бизнес-логика ложится в этот протокол.
Но мы-то обсуждаем Web. А он базируется на HTTP
А.З.ф.И.> Ну хотя бы просто запрос, который длится долго. HTTP request приходит, но немедленно выполнить нельзя. Ложим запрос в очередь на выполнение демону, выдаем страничку - "Ждите ответа...".
HTTP — сессионный. Мы не можем что-то выдать, сказать «ждите», а когда готово, со стороны сервера инициировать какое-то событие «получите результат». Сервер, вообще, не может инициировать соединение с клиентом ни в каком виде. Поэтому возможны только два сценария:
1. Клиент шлёт тяжёлый запрос. Сервер уходит в обработку и держит открытым соединение. Клиент всё это время ждёт. Сервер заканчивает работу и отдаёт результат. Это самый простой и часто используемый вариант, никаких хитростей, всё работает тупо.
2. Клиент шлёт тяжёлый запрос. Сервер просекает это, кидает клиенту лёгкую заглушку, отсоединяется и уходит на обработку. Клиент после этого, во время работы сервера, через AJAX или просто релоадами периодически дёргает сервер спрашивая «ну как там, готово?» (или при тупых релоадах просто получает раз за разом заглушку). Когда сервер готов, то он, наконец, отвечает клиенту на очередном запросе последнего результатом.
Это «современный» вариант. На Авиабазе так сейчас генерация превьюшек сделана, рассылка нотификаций об обновлениях топиков (сейчас отключена) на e-mail и xmpp. Со временем, наверное, все тяжёлые операции нужно на такое перевести, чтобы видимая отзывчивость сервера была выше.
На серверах с логикой JVM-подобных систем обычно реализуется запуском отдельного треда, который и займётся работой. В то время, как основной тред закроет соединение.
На серверах с сессионной логикой (в т.ч. с PHP) понятие сервера в какой-то степени расширяется на всю машину. Процесс, который занимается первичной обработкой запроса тем или иным способом формирует задачу и извещает о ней того или иного исполнителя. Скажем, может положить запись в БД, которую оттуда возьмёт cron-скрипт. Или отправит сообщение в gearman, а с него снимет отдельный демон (мой вариант). Дальше процесс-инициатор закроется. Процесс-обработчик положит результат куда надо и при очередном «проверочном» запросе основной скрипт обнаружит результат, отдав его клиенту.