Motyw
Zadania CRON i Harmonogram Automatyzacji
Silnik Harmonogramu Zadań CRON w platformie Ammonly odpowiada za w pełni zautomatyzowane, cykliczne wykonywanie krytycznych procesów w tle, takich jak synchronizacja poczty i kalendarzy, nadzór nad statusem spraw biznesowych, kolejkowanie zadań asynchronicznych oraz automatyczne czyszczenie logów.
Architektura API-First i Multi-DB
Zadania CRON operują w architekturze Multi-Tenant/Multi-DB. Wszystkie zadania implementują standardowy interfejs CronTaskInterface i mogą być wykonywane zarówno w profilu zarządzania konsolą (app-admin), jak i w profilach biznesowych klientów SaaS (app-client).
Spis treści
- 1. Architektura silnika zadań CRON
- 2. Atrybuty konfiguracyjne i metryki zadania
- 3. Szczegółowy katalog akcji CRON
- 3.1. Nadzorca statusów zdarzeń kalendarza (calendar_status_supervisor)
- 3.2. Synchronizacja poczty przychodzącej i Helpdesk (inbound_email_sync)
- 3.3. Dyspozytor wychodzącej kolejki e-mail (mail_queue_worker)
- 3.4. Robot kolejki zadań asynchronicznych (queue_worker)
- 3.5. Synchronizacja wychodząca CalDAV/CardDAV (dav_queue_worker)
- 3.6. Synchronizacja przychodząca CalDAV/CardDAV (dav_pull_sync)
- 3.7. Czyszczenie wygasłych sesji użytkowników (session_cleanup)
- 3.8. Retencja i czyszczenie logów CRON (cron_log_cleanup)
- 3.9. Retencja i czyszczenie logów żądań API (api_log_cleanup)
- 3.10. Retencja dziennika audytowego (audit_log_cleanup)
- 3.11. Asynchroniczne generowanie dokumentów PDF (pdf_queue_worker)
- 4. Cykl życia i diagram wykonania zadania
- 5. Zarządzanie zadaniami z poziomu CLI i API
1. Architektura silnika zadań CRON
Silnik harmonogramu opiera się na centralnym rejestrze zadań (a_mod_cron_records), rejestrze logów wykonania (a_logs_cron_records) oraz module wykonawczym CronRunner.
mermaid
flowchart TD
SystemCron[Systemowy Demon Cron OS: * * * * *] --> CLIEntry[CLI Entrypoint: php bin/cron]
CLIEntry --> CronRunner[CronRunner Engine]
CronRunner --> ReadTasks[Odczyt aktywnych zadan z a_mod_cron_records]
ReadTasks --> CheckSchedule{Czy nadszedl czas wg wyrazenia cron?}
CheckSchedule -- Nie --> Skip[Pomin zadanie]
CheckSchedule -- Tak --> CheckLock{Czy is_running = 1?}
CheckLock -- Tak i nie wygasl timeout --> SkipRunning[Pomin: zadanie w toku]
CheckLock -- Nie lub timeout wygasl --> Execute[Wywolaj command_class::run]
Execute --> AuditLog[Zapisz czas, status i pamiec w a_logs_cron_records]
AuditLog --> UpdateNextRun[Zaktualizuj next_run_at i is_running = 0]Kluczowe właściwości architektury:
- Pojedynczy interfejs kontraktowy: Każda klasa zadania implementuje
App\Core\Cron\CronTaskInterfacez metodąpublic function run(): string. - Zabezpieczenie przed zakleszczeniem (Concurrency Lock): Każde zadanie oznacza flagę
is_running = 1wraz ze znacznikiem czasu. W przypadku awarii serwera, po przekroczeniutimeout_secondszadanie jest resetowane. - Izolacja bazodanowa: Każde zadanie używa dynamicznego mechanizmu
MultiDbRouterlubFallbackPdoResolver, dzięki czemu może operować na właściwym schemacie (ammonly_adminlubammonly_client).
2. Atrybuty konfiguracyjne i metryki zadania
Tabela a_mod_cron_records definiuje zachowanie każdego zadania:
| Pole | Typ | Opis |
|---|---|---|
name | VARCHAR(64) | Unikalna nazwa identyfikacyjna zadania (np. calendar_status_supervisor). |
label | VARCHAR(255) | Czytelna nazwa wyświetlana w panelu administracyjnym. |
command_class | VARCHAR(255) | W pełni kwalifikowana nazwa klasy PHP implementującej CronTaskInterface. |
expression | VARCHAR(64) | Standardowe 5-polowe wyrażenie cron (np. */15 * * * * lub 0 3 * * *). |
timeout_seconds | INT | Maksymalny dozwolony czas trwania (domyślnie 300 sekund) przed zwolnieniem blokady. |
is_active | TINYINT(1) | Flaga włączenia zadania (1 = aktywne, 0 = wyłączone). |
is_running | TINYINT(1) | Flaga aktywnego wykonywania (1 = w trakcie biegu). |
last_run_at | DATETIME | Znacznik czasu ostatniego uruchomienia. |
next_run_at | DATETIME | Wyliczony czas następnego planowanego wykonania. |
last_status | VARCHAR(32) | Status ostatniego wykonania: success, failed, running, idle. |
last_duration_ms | INT | Czas wykonania zadania w milisekundach. |
3. Szczegółowy katalog akcji CRON
Poniżej znajduje się kompletny opis wszystkich akcji automatyzacji zaimplementowanych w platformie Ammonly:
3.1. Nadzorca statusów zdarzeń kalendarza (calendar_status_supervisor)
- Identyfikator techniczny:
calendar_status_supervisor - Klasa wykonawcza:
App\Modules\Calendar\Task\CalendarStatusSupervisorTask - Harmonogram domyślny:
* * * * *(co minutę) - Dostępność w profilach:
client,admin
Cel i zasada działania:
Automatycznie nadzoruje cykl życia wszystkich zdarzeń zarejestrowanych w module Kalendarza (a_mod_calendar_records). Zapewnia, że statusy spotkań, telefonów i zadań odzwierciedlają upływający czas rzeczywisty:
- Przejście
planned➔in_progress: Gdy nadejdzie czas rozpoczęcia spotkania (start_date <= NOW() < end_date), zadanie automatycznie przestawia status na „W trakcie” (in_progress), co skutkuje żółtym wyróżnieniem w kalendarzu i na pulpicie. - Przejście
planned/in_progress➔overdue: Gdy minie planowany czas zakończenia (end_date <= NOW()), a zdarzenie nie zostało wcześniej zamknięte przez użytkownika, zadanie oznacza je jako „Zaległe” (overdue), generując czerwony alert w widgetach. - Ochrona stanów końcowych: Statusy terminalne (
completed,cancelled,postponed) są nienaruszalne i nigdy nie podlegają automatycznej modyfikacji.
Wpływ na działanie systemu
Bez tego zadania zdarzenia w kalendarzu pozostawałyby w stanie planowanym nawet po upływie terminu spotkania, co uniemożliwiłoby poprawne działanie widgetów zaległych spraw na pulpicie (Dashboard).
3.2. Synchronizacja poczty przychodzącej i Helpdesk (inbound_email_sync)
- Identyfikator techniczny:
inbound_email_sync - Klasa wykonawcza:
App\Modules\Mail\Task\InboundEmailSyncTask - Harmonogram domyślny:
* * * * *(co minutę) - Dostępność w profilach:
client,admin
Cel i zasada działania:
Łączy się ze wszystkimi aktywnymi skrzynkami systemowymi oraz kontami użytkowników (protokoły IMAP / POP3 / SSL) w celu pobrania nowej korespondencji:
- Pobieranie i dekodowanie wiadomości: Pobiera nagłówki RFC 822, treść MIME (HTML i tekst zwykły) oraz załączniki, zapisując je w
a_mod_emails_records. - Kojarzenie z kartoteką CRM: Na podstawie adresu e-mail nadawcy automatycznie wiąże wiadomość z istniejącą firmą (
companies) lub kontaktem (contacts). - Automatyzacja Email-to-Ticket: Dla wiadomości trafiających na dedykowane skrzynki wsparcia (Helpdesk) uruchamia reguły automatycznego tworzenia nowych zgłoszeń serwisowych (
tickets) lub dołączania odpowiedzi do istniejącego wątku zgłoszenia.
3.3. Dyspozytor wychodzącej kolejki e-mail (mail_queue_worker)
- Identyfikator techniczny:
mail_queue_worker - Klasa wykonawcza:
App\Modules\Mail\Task\ProcessMailQueueTask - Harmonogram domyślny:
* * * * *(co minutę) - Dostępność w profilach:
client,admin
Cel i zasada działania:
Odpowiada za bezpieczną, asynchroniczną wysyłkę wiadomości zebranych w kolejce a_mod_mail_queue_records:
- Pobieranie oczekujących paczek: Wybiera wiadomości o statusie
pending, posortowane wg priorytetu (high,normal,low) i daty zakolejkowania. - Wysyłka przez właściwy serwer SMTP: Używa poświadczeń przypisanych do skrzynki nadawcy lub globalnego serwera SMTP systemu.
- Obsługa błędów i ponowień (Retry Loop): W przypadku przejściowych błędów sieciowych lub odmowy SMTP (Greylisting, błędy 4xx), zadanie zwiększa licznik prób (
attempts_count) i planuje ponowienie z wykładniczym opóźnieniem (Exponential Backoff). Po przekroczeniu limitu prób wiadomość otrzymuje statusfailed.
3.4. Robot kolejki zadań asynchronicznych (queue_worker)
- Identyfikator techniczny:
queue_worker - Klasa wykonawcza:
App\Modules\Automation\Queue\Task\ProcessQueueTask - Harmonogram domyślny:
* * * * *(co minutę) - Dostępność w profilach:
client,admin
Cel i zasada działania:
Przetwarza ciężkie operacje w tle zarejestrowane w tabeli a_mod_queue_records:
- Zadania w tle: Masowe operacje na rekordach (edycja masowa, usuwanie kaskadowe), przebudowa struktur WBS, generowanie zestawień analitycznych, przeliczanie sum wartości kontraktów i budżetów projektów.
- Śledzenie postępu w czasie rzeczywistym: Aktualizuje wskaźnik procentowy
progress_percentoraz licznikiprocessed_items/total_items, umożliwiając prezentację paska postępu w interfejsie użytkownika. - Wykrywanie zawieszonych zadań (Heartbeat): Co kilka sekund odświeża znacznik
heartbeat_at. Jeśli proces padnie, kolejny przebieg robota przejmie lub zrestartuje przerwane zadanie.
3.5. Synchronizacja wychodząca CalDAV/CardDAV (dav_queue_worker)
- Identyfikator techniczny:
dav_queue_worker - Klasa wykonawcza:
App\Modules\Dav\Task\ProcessDavQueueTask - Harmonogram domyślny:
* * * * *(co minutę) - Dostępność w profilach:
client,admin
Cel i zasada działania:
Wysyła lokalne modyfikacje zdarzeń kalendarza oraz kontaktów do zewnętrznych serwerów CalDAV/CardDAV (np. Google Calendar, Apple iCloud, Nextcloud, Microsoft Exchange via DavGateway):
- Generuje obiekty iCalendar (RFC 5545) oraz vCard (RFC 6352).
- Wysyła zapytania
PUT,DELETElubPROPPATCHz zachowaniem wersjiETagi sekwencji rewizji (sequence).
3.6. Synchronizacja przychodząca CalDAV/CardDAV (dav_pull_sync)
- Identyfikator techniczny:
dav_pull_sync - Klasa wykonawcza:
App\Modules\Dav\Task\PullDavSyncTask - Harmonogram domyślny:
*/2 * * * *(co 2 minuty) - Dostępność w profilach:
client,admin
Cel i zasada działania:
Cyklicznie odpytuje zewnętrzne serwery CalDAV/CardDAV (metoda REPORT / sync-collection) o nowe zdarzenia i kontakty utworzone na urządzeniach mobilnych użytkowników:
- Pobiera zmienione zasoby i parsuje struktury
.icsoraz.vcf. - Zapisuje nowe rekordy w bazie Ammonly lub aktualizuje istniejące powiązania.
3.7. Czyszczenie wygasłych sesji użytkowników (session_cleanup)
- Identyfikator techniczny:
session_cleanup - Klasa wykonawcza:
App\Core\Session\CleanupExpiredSessionsTask - Harmonogram domyślny:
*/15 * * * *(co 15 minut) - Dostępność w profilach:
admin,client
Cel i zasada działania:
Usuwa przeterminowane sesje użytkowników z tabeli a_mod_user_sessions:
- Porównuje znacznik
last_activityz globalnym czasem życia sesji (session.lifetime). - Trwale usuwa rekordy wygasłych sesji, chroniąc bazę przed niekontrolowanym wzrostem wolumenu danych oraz realizując wytyczne bezpieczeństwa NIST AC-12 (Session Termination).
3.8. Retencja i czyszczenie logów CRON (cron_log_cleanup)
- Identyfikator techniczny:
cron_log_cleanup - Klasa wykonawcza:
App\Core\Cron\CleanupCronLogsTask - Harmonogram domyślny:
0 3 * * *(codziennie o 03:00 w nocy) - Dostępność w profilach:
admin,client
Cel i zasada działania:
Czyści wpisy w dzienniku a_logs_cron_records starsze niż zdefiniowany w parametrach systemu okres retencji (domyślnie 30 dni), zapobiegając degradacji wydajności zapytań indeksowych bazy.
3.9. Retencja i czyszczenie logów żądań API (api_log_cleanup)
- Identyfikator techniczny:
api_log_cleanup - Klasa wykonawcza:
App\Core\Cron\CleanupApiLogsTask - Harmonogram domyślny:
0 3 * * *(codziennie o 03:00 w nocy) - Dostępność w profilach:
admin,client
Cel i zasada działania:
Przegląda tabelę rejestru wywołań interfejsu REST/HTMX a_logs_api_requests_records i usuwa wpisy przekraczające dopuszczalny okres przechowywania (zgodnie ze standardami NIST AU-9 oraz AU-11).
3.10. Retencja dziennika audytowego (audit_log_cleanup)
- Identyfikator techniczny:
audit_log_cleanup - Klasa wykonawcza:
App\Core\Audit\Infrastructure\Cron\AuditRetentionCronJob - Harmonogram domyślny:
0 4 * * *(codziennie o 04:00 w nocy) - Dostępność w profilach:
admin,client
Cel i zasada działania:
Nadzoruje tabele dziennika audytu zmian (a_logs_audit_create_records, a_logs_audit_read_records, a_logs_audit_update_records, a_logs_audit_delete_records). Archiwizuje lub usuwa wpisy starsze niż ustalony okres zgodności prawnej i bezpieczeństwa (np. 90 lub 365 dni).
3.11. Asynchroniczne generowanie dokumentów PDF (pdf_queue_worker)
- Identyfikator techniczny:
pdf_queue_worker - Klasa wykonawcza:
App\Modules\Pdf\Task\ProcessPdfQueueTask - Dostępność w profilach:
admin,client
Cel i zasada działania:
Pobiera zadania masowego generowania plików PDF (faktury, oferty handlowe, raporty kart pracy, umowy SLA) i kompiluje szablony HTML/Twig do plików PDF w tle, zapobiegając blokowaniu żądań HTTP użytkowników.
4. Cykl życia i diagram wykonania zadania
mermaid
stateDiagram-v2
[*] --> Idle: Inicjalizacja zadania
Idle --> Scheduled: Nadszedł czas (Cron Expression)
Scheduled --> Running: Przejęcie blokady (is_running = 1)
Running --> Success: Wykonanie poprawne (run() -> string)
Running --> Failed: Błąd / Wyjątek Throwable
Running --> Timeout: Przekroczenie timeout_seconds
Timeout --> Idle: Zwolnienie blokady przez Supervisor
Success --> Idle: Zapis logu, is_running = 0, wyliczenie next_run_at
Failed --> Idle: Zapis błędu w logu, is_running = 05. Zarządzanie zadaniami z poziomu CLI i API
Uruchamianie przez konsolę CLI:
bash
# Uruchomienie pełnego przebiegu wszystkich oczekujących zadań
php bin/cron
# Wymuszenie natychmiastowego wykonania konkretnego zadania
php bin/cron --task=calendar_status_supervisor
# Uruchomienie harmonogramu dla konkretnego profilu
php bin/cron --profile=clientZarządzanie przez panel WWW i REST API:
- Panel Administratora: Moduł dostępny pod ścieżką
/automation/cron. - REST API Endpoint:
GET /api/v1/engine/automation_cron/records– pobranie listy zadań i ich statusów.POST /api/v1/engine/automation_cron/{id}/run– natychmiastowe wyzwolenie zadania.PATCH /api/v1/engine/automation_cron/{id}– zmiana harmonogramu lub aktywacja/deaktywacja zadania.