В прикрепленном архиве файлы разработанного мною comet-сервера. О comet-технологии
можете почитать в инете. Коротко это работает так:
Суть в обеспечении обратной связи, когда web-клиент принимает запросы от сервера, а не наоборот как
в стандартном протоколе http. Технически это реализуется так:
Web-клиент посылает ajax http-запрос на порт, который слушает текущий скрипт. Скрипт принимает соединение,
но не закрывает и не отвечает на запрос! Когда появляется необходимое событие - скрипт посылает ответ и
закрывает соединение. Клиент, приняв ответ, снова делает запрос. Если определенное время не происходит
никаких событий - клиент закрывает соединение и пересоздает снова.
Comet-сервера обычно работают поверх стандартных web-серверов, настроенных на большие таймауты. В моем случае (а я писал под реальную задачу) нельзя было использовать стандартный, поэтому я написал свой небольшой веб-серверочек noHttpd.pm. Можете использовать не только для comet-сервера, с ним очень просто работать, я ниже напишу как.
Этот http-сервер не многопоточный, а мультиплексный. Т.е. его можно применять исключительно в случае, когда обработка запросов не требует обращения к каким-либо внешним ресурсам, которые имеют хотя бы минимальный таймаут. В моем случае обработка примитивная, поэтому я не изъябывался с потоками (их всего 2 - один для вебсервера и один для основного скрипта).
Как вы уже поняли у нас есть 3 стороны сего процесса:
- браузер клиента
- comet-сервер
- web-сервер (который обрабатывает не comet-запросы)
Коротко процесс выглядит так. Клиент запрашивает страничку у web-сервера, например со списком платежей такого-то клиента (это реальная задача, которую я делал, только речь не идет о NoDeny). Web-сервер связывается с comet-сервером и грит ему: вот такой-то клиент создает канал такой-то (тут сгенерированное имя канала) и хочет получать обновления когда будут такие условия (а в условии сказано "когда такие-то платежи будут меняться"). Web-сервер отдает страничку со списком платежей в браузер клиента. В этой страничке присутствует реально небольшой фрагмент на javascript который использует noComet.js для общаения с comet-сервером noComet.pl по заданному имени канала. Если параллельно какой-то админ изменяет статус платежа, который попадает в условие, то комет-сервер сигнализирует текущему клиенту "произошло событие такое-то, id=xxx". Клиент выполняет ajax-запрос к web-серверу и просто перечитывает тукущий платеж. В моем примере он просто перерисовывал на экране строку с данными платежа (там администраторы параллельно захватывают платежи на обработку и нужно чтобы было видно, что платеж, который ты собираешься захватить уже забрал кто-то)
Теперь технические детали.
Вам понадобятся (в архиве):
Debug.pm - охуенный модуль дебага, я его вылизывал почти год (это не значит, что он сложный, просто я сделал его простым и удобным). Он предназначен для ведения логов и дебагов в консоли/файле/вебе. Особенно удобно ведет он себя в вебе, когда каждый шаг отображается в виде строчки таблицы, в которой есть время выполнения от начала создания объекта дебага, полный путь к текущей операции (разворачивается по плюсику), ну и др. вкусности. Вы можете в него заглянуть там есть примеры, хотя и не все. Например, в случае краша, в одном из проектов, я сделал чтоб вся дебажная инфа (как объект) серилизовалась (методом этого же модуля) и записывалась в бд. Потом админ извлекает конкретный снимок и видит
вселенную в первозданном виде полный дебаг краша как будто он произошел при нем. Кстати, не обязательно краша. Например, клиент не может выполнить какую-то операцию, берем ставим его на карандаш - все дебаги пишутся в БД (в серилизованном виде как я уже грил). Мы извлекаем эти дебаги и видим, что этот лось вводит сумму меньше нуля.
Еще нам понадобится StartMod.pm - это маленький модуль сделал совсем недавно для обработки ключей командной строки и сигналов TERM и INT. Просто у меня скопилось много однотипных скриптов, которые постоянно висят демонами, я их заставил принимать ключи этим модулем. Ключей мало:
-v - ведем дебаг
-vv - ведем более информативный дебаг
-f=файл - лог и дебаг (если ведется) идут в файл "файл"
Например:
noComet.pl -vv
P.S. Ессно я напишу продолжение, чуть позже. Но сейчас я хочу сказать, что пока не придумал по какой лицензии распространять мои файлы, я пока временно ставлю запрет на их распространение. Вы можете только тестировать эти файлы для личных целей, не изменяя их в случае если кто-то еще попросит их потестировать. Это временно, пока я не придумал под чем лицензировать)