Основной цикл системы
В этой заметке я опишу, как функционирует система с точки зрения задач, выполняемых периодически.
Для начала, имеет смысл сказать, что система может обрабатывать поступающие сигналы от внешних устройств и без запуска основных циклов. Система представляет собой веб-сервис и обработка входящего события в виде HTTP-запроса будет запущена сразу по поступлению запроса. Однако, есть ряд задач, которые должны инициироваться системой "изнутри", для этого вместе с веб-сервисом работают так называемые основные циклы.
Пару слов о том, почему эти сущности называются циклами. Всё просто -- они собой представляют запущенные бесконечные циклы, каждый из которых периодически инициирует то или иное событие, в зависимости от того, для чего этот цикл был запущен. Почему их несколько? Просто потому, что это позволяет паралельно и независимо друг от друга обеспечивать запуск тех или иных процедур.
Итак, циклы должны запускаться вместе со стартом системы и не закрываться в процессе работы. Инициируются циклы запуском скрипта ./cycle.php. Что делает этот скрипт -- он смотрит в папке ./scripts/ все файлы с именем cycle_*.php и создаёт паралельные процессы на запуск каждого из этих "дочерних" скриптов. Соответственно, каждый cycle-скрипт самостоятельно определяет, какие именно действия он должен производить.
На данный момент имеются вот такие основные циклы (их количество может меняться в зависимости от конфигурации системы):
- cycle_main.php -- самый базовый цикл системы, обновляет системное время, а так же отвечает за работу объектов класса Timer
- cycle_scheduler.php -- отвечает за выполнение задач, запланированных с помощью функций setTimeOut, AddScheduledJob и им подобных
- cycle_execs.php -- цикл, отвечающий за запуск команд, добавленных через функцию safe_exec
- cycle_webvars.php -- цикл, обеспечивающий обновление веб-переменных
- cycle_bluetooth.php -- цикл сканера bluetooth-устройств
- cycle_onewire.php , cycle_onewire_starred.php -- циклы опроса 1-wire сети
- cycle_ping.php -- цикл опроса устройств online
- cycle_rss.php -- цикл обновления RSS-потоков
- cycle_skype.php (windows), cycle_X101_skype.php (linux) -- цикл/демон скайп-бота
- cycle_snmp.php -- цикл опроса SNMP-устройств
- cycle_states.php -- цикл обновления статусов состояния системы
- cycle_watchfolders.php -- цикл сканирования изменений папок
- cycle_zwave.php -- цикл опроса Z-Wave устройств?
Рассмотрим, что представляет собой cycle-скрипт на примере цикла ./scripts/cycle_webvars.php.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
chdir(dirname(__FILE__) . '/../'); //переходим на папку уровнем выше (для сохранения путей к библиотекам) include_once("./config.php"); include_once("./lib/loader.php"); include_once("./lib/threads.php"); set_time_limit(0); // нужно обязательно для того, чтобы система не закрыла скрипт по тайм-ауту // соединяемся с базой данных $db = new mysql(DB_HOST, '', DB_USER, DB_PASSWORD, DB_NAME); // загружаем настройки include_once("./load_settings.php"); include_once(DIR_MODULES . "control_modules/control_modules.class.php"); $ctl = new control_modules(); // подключаем модуль веб-переменных include_once(DIR_MODULES . 'webvars/webvars.class.php'); $webvars = new webvars(); while(1) // начало бесконечного цикла { //выводим информацию о том, что цикл работает (без этого бывало, что система закрывала процесс из-за неактивности) echo date("H:i:s") . " running " . basename(__FILE__) . "\n"; // на всякий случай каждый час пишем в лог, что цикл работает -- можно убрать if (!$updated_time || (time() - $updated_time) > 1 * 60 * 60) { //Log activity every hour DebMes("Cycle running OK: ".basename(__FILE__)); $updated_time=time(); } // устанавливаем переменную времени последнего прохождения цикла -- полезно для слежения за тем, работает ли цикл setGlobal((str_replace('.php', '', basename(__FILE__))).'Run', time()); // далее, непосредственно действие, которое нужно вызывать периодически // в данном случае, это запуск процедуры обновления веб переменных // (какие именно переменные нужно обновлять это уже забота модуля -- наша задача каждую секунду запускать метод проверки) $webvars->checkAllVars(); // если появляется в корневой папке файл ./reboot, то выходим из цикла -- система закрывает процесс // когда все процессы, инициированные скриптом ./cycle.php будут закрыты, то и сам скрипт закроется if (file_exists('./reboot')) { $db->Disconnect(); exit; } sleep(1); // пауза в 1 секунду, чтобы не перегружать процессор } |
One thought on - Основной цикл системы в MajorDoMo
некорректно заменены знаки >
$webvars->checkAllVars();