Entry point
Singurul si unicul entry point este executia in command line a :
/site/yii cron
Cat de des
Cel mai des poate fi la fiecare 10 minute. Fiecare din procesele de cron inregistrate vor fi executate automat numai in concordanta cu frecventele de executie individuale cu care au fost inregistrate.
Cum functioneaza
Se pune pe cron-ul de sistem acest /site/yii cron, ca mai sus. La fiecare x minute (10 minute in exemplul nostru) se va executa deci yii cron (in fapt /console/controllers/CronController.php pe actionIndex()) care verifica toate procesele de cron inregistrate si inca ne-executate. Aceste “procese cron inregistrare” sunt de fapt niste controller+action care sunt introduse in tabela cron, si care specifica si cand/cum trebuiesc apelate. La fiecare executie, pentru procesele ce se executa in fapt, se inregistreaza log in tabela cron_track, inclusiv cu status de succes/fail. Nu vor exista executii duble sau redundente.
Unde scriu procesele individuale de cron
Unde crezi ca este mai bine (verifica cu Andi), insa acel loc (ie controller/action) trebuie sa fie accesibil din afara conturilor de user, adica standalone.
Obs.: un “proces de cron” este de fapt o actiune, intr-un controller.
Unde inregistrez procesul meu de cron
In baza de date, in tabela cron, DAR NU DIRECT (vezi mai jos):
- name : o denumire a procesului, ca sa stim toti ce face
- type : 1=recurrent, 2=one-time
- referenceType : tipul referintei, adica de unde a fost inserat acest proces (de exemplu daca a fost inserat din contracte, avem referenceType=CronController::$REFERENCETYPE_CONTRACTS
- referenceId : ID-ul referintei (de exemplu daca acest proces a fost inserat din contracte, referenceId va avea ID-ul contractului…)
- match* : (Year,Month,…,Second) frecventa de executie; de exemplu, daca vrei executie zilnic, la ora 23:30:00, setezi matchHour=23, matchMinute=30, matchSecond=0 , restul le lasi pe NULL; daca in plus vrei sa fie executat la fiecare 25 ale lunii, setezi si matchDay=25 si restul le lasi pe NULL
- targetRealm : de unde este controller-ul : frontend , backend , console
- targetController : controller-ul tau
- targetAction : action-ul tau
- targetQueryString : parametrii pe care vrei sa-i trimiti la action; de exemplu : gigel=23&date=20161111&etc=111
- enabled : 0=nu, nu se va executa deloc, 1=se va executa
Cum inregistrez un proces cron
Se apeleaza functia asta, asa:
Cron::register('test cron',Cron::$REFERENCETYPE_CONTRACTS,1313,['matchYear'=>2017,'matchDay'=>13],'frontend','gigel','fa-ceva',['companyId'=>Company::currentId()],0);
Functia va intoarce FALSE in caz de eroare sau un INT > 0 in caz de succes. Acest INT este ID-ul unic al inregistrarii procesului cron, pastreaza-l undeva pentru a putea sterge sau modifica procesul de cron.
Atentie, NICIODATA sa nu inserezi direct, de mana, in tabela de cron. INTOTDEAUNA foloseste functia de mai sus.
Cum sterg un proces cron
Se apeleaza asa:
$deleted = Cron::deleteProcess($processId);
Si $deleted poate fi intors ca:
- TRUE : procesul specificat a fost sters
- -1 : procesul specificat nu mai poate fi sters pentru ca a fost deja executat (oricum nu mai are rost sa-l stergi in faza asta…)
- -2 : procesul specificat nu exista
- -3 : s-a incercat stergerea dar din oarece motive nu s-a reusit (Model->delete() a intors eroare!)
- -4 : nu ai voie sa stergi procesul (este proces de sistem…)
Atentie, NICIODATA sa nu stergi direct, de mana, din tabela de cron. INTOTDEAUNA foloseste functia de mai sus.
Cum modific un cron
Prin stergere si re-creare 🙂
Obligatoriu
- in codul cron-ului tau trebuie neaparat sa verifici DIN NOU daca se executa cand trebuie, si daca nu exista dubluri de executie
- in codul cron-ului tau trebuie NEAPARAT sa ai error handling si in plus, in caz DE ORICE EROARE TREBUIE SA AFISEZI UNA DIN ACESTEA : “ERROR” , “WARNING” , “NOTICE” , “FATAL; sistemul de cron capteaza tot output-ul si se uita dupa aceste cuvinte; daca exista, seteaza status-ul executiei pe FAILED
- can inserezi din alte sectiuni procese de cron, ai grija mare la ce inserzi, si mai ales ai grija sa setezi corect referenceType si referenceId
- pe cale de consecinta, in procesul tau (pe care il integistrezi in cron) NU TE BAZA PE ID-UL COMPANIEI CURENTE pentru ca la runtime acesta NU EXISTA. Ai grija sa trimiti $companyId in cron ca parametru pe registerProcess -> $params, ca in exemplul de mai sus
- pentru ca sistemul de cron sa poata executa chestii, in params-local.php (in common) trebuie sa ai:
'UrlRoot'=>'http://localhost/cfo/site/frontend/web', // pe live e : http://app.max-ba.ro, adapteaza local-ului tau...
Procesele standard pe crontab
La zi:
0 0 * * * curl http://ppa.max-ba.ro/maintenance/daily >/dev/null 2>&1 0 0 * * * curl https://app.max-ba.ro/developer/fetch-bnr?mode=year >/home/ubuntu/logs/fetchbnr.log 0 4 * * * curl https://app.max-ba.ro/developer/create-instant-demo-account >/home/ubuntu/logs/createinstantdemoaccount.log 30 4 * * * curl https://app.max-ba.ro/subscription-type/check-and-apply-subscription-changes */10 * * * * curl http://ppa.max-ba.ro/maintenance/get-ip-remote-infos # 0 0 * * * php /var/www/staging/site/yii cron >/home/ubuntu/logs/crontab.log 30 * * * * php /var/www/app/site/yii cron >/home/ubuntu/logs/crontab.log 30 1 * * * sh /home/ubuntu/backup_maxba_db 48 15 * * * sh /home/ubuntu/backup_maxba_db