Zadania cykliczne (Cron)
W tym rozdziale skupimy się na mechanizmie zadań cyklicznych, uruchamianych przez Cron-a.
Nasz cron działa w połączeniu z bazą danych i ma zapisane zadania w tabeli public.crontab
Dodanie zadania do tabeli
By dodać nowe zadanie dla Crona, należy wykonać bezpośrednio sql-owego insert-a do wyżej wymienionej tabeli.
Przykład
INSERT INTO crontab (every_, hour__, min___, dom___,mon___,dow___, path__,class_, cargs_, meth__, margs_, dscrpt, usr_id, ent_id,is_del )
VALUES ('day',
20,
0,
NULL,
NULL,
'1,2,3,4,5',
'./classes/CronRunner/dispatchers/SummaryReportCronDispatcher.inc',
'SummaryReportCronDispatcher',
NULL,
'forward',
'',
'W każdy dzień o 20',
NULL,
{ent_id},
FALSE
)
Omówienie Tabeli
- Kolumny
- hour__ i min___ - mówią o której konkretnie godzinie i minucie ma się uruchomić, podana klass-a
- every_ - mówi co jaki przedział czasu ma zostać uruchomiony skrypt. Warianty minute i day I tu możemy na chwile się zatrzymać by omówić zależności miedzy powyższymi trzema kolumnami. bo jeśli ustawimy kolumne every_ na minute co znaczy w prost, uruchamiaj klasę co podaną minutę w kolumnie min___ i tu już nie podajem,y konkretnej godziny ! ale jeśli chcemy uruchamiać skrypt co dzień o podanej godzinie i minucie to wystarczy wprowaqdzić w kolumne every_ wartość day i odpowiednio w hour__ min___ wybrany czas.
- dow___ - tutaj musimy wpisać w jakie dni tygodnia ma zostać uruchomiony skrypt. Uwaga ! Niedziela jest pierwszym dniem tygodnia i odpowiada temu cyfra 0, dla reszty dni tygodnia, kolejno 1,2,3 itd.
- path__ - czyli ścieżka do pliku, w którym znajduje się klasa,
- class_ - czyli namespace z nazwą klasy, którą będziemy wywoływać,
- meth__ - Podajemy nazwę metody, która ma zostać wywołana,
- margs_ - są to podane w formie json-a argumenty dla metody,
- dscrpt - czyli opis, co dana metoda robi, czym więcej informacji dodasz tym później będzie łatwiej się połapać przy większej ilości wpisów,
- usr_id - Identyfikator użytkownika, najczęściej wprowadzona wartość NULL,
- ent_id - Id podmiotu,
- is_del - czy ten wpis jest usunięty, należy wpisywać w formie boolean (false, true)
Jak napisać klasę
Jak już wcześniej mówiliśmy, w tabeli zapisujemy miejsce przechowywania metody oraz namespace z nazwą klasy.
W klasie musimy utworzyć metodę, która odpowiada podanej nazwie z kolumny meth__ do której możemy przekazać parametry z kolumny margs_,
Przykład Klasy
<?php
class CountUsersCron {
private $logger;
public function execute($params) {
if (!is_array($params)) {
$params = unserialize($params);
}
$db = PgManager::getInstance();
$countUserLogIn = $db->select('users_status', 'count(*) as NumberUserLogin', "lastse > '".date('Y-m-d')."'", false, PGSQL_ASSOC);
if (!isset($countUserLogIn[0])) {
return FALSE;
}
$this->logMessage(sprintf(Translator::translate('Ilość zalogowanych użytkowników to %s'), $countUserLogIn[0]['NumberUserLogin']));
return TRUE;
}
private function logMessage($message) {
if ($this->logger) {
$this->logger->write($message);
}
}
}
Przykład skryptu:
CountUsersCron.inc
Dodanie przykładowej klasy do tabeli cronTab poprzez instert-a
INSERT INTO crontab (every_, hour__, min___, dom___,mon___,dow___, path__,class_, cargs_, meth__, margs_, dscrpt, usr_id, ent_id,is_del )
VALUES ('day',
20,
0,
NULL,
NULL,
'1,2,3,4,5',
'./classes/CronRunner/CountUsersCron.inc',
'CountUsersCron',
NULL,
'execute',
'',
'W każdy dzień o 20',
NULL,
{ent_id},
FALSE
)
Czy da się dodać joba dla crona przez system ? Otóż tak!
Wystarczy by w metodzie tworzącej (ang. create) dialog, utworzyć obiekt CronPanelDialog, odpowiednio go ustawić i nazwać
a następnie na metodzie zapisy (ang. save), ustawić joba poprzez metode setJob, przekazać odpowiednie parametry (szczegóły poniżej) a następnie wywołać metodę save.
- Parametry dla metody setJob, wymagane: path, path, class, cArgs, method. Nie wymagane (domyślnie wartość NULL): mArgs, dscrpt