Hvis du spør, "Hva er Yii?" sjekk ut min tidligere opplæring: Introduksjon til Yii Framework, som vurderer fordelene med Yii og inneholder en oversikt over hva som er nytt i Yii 2.0, utgitt i oktober 2014.
I denne programmeringen med Yii2-serien, veileder jeg lesere i bruk av Yii2 Framework for PHP. I dagens veiledning deler jeg med deg hvordan du kan dra nytte av Yii konsollkapasitet til å kjøre cron-jobber.
Tidligere har jeg brukt wget i mine cron-jobber - en nettadresselig URL ville kjøre bakgrunnsoppgaver. Dette hevede sikkerhetsproblemer og har noen ytelsesproblemer. Mens jeg tok opp noen måter å redusere risikoen i episodene på sikkerhetsområdet, hadde jeg håpet å overgå til konsolldrevne kommandoer. Og med Yii2 er det ganske enkelt.
For dagens eksempel, vil jeg demonstrere konsollbaserte cron-kommandoer på min Twixxr-side som jeg beskrev i denne Twitter API-episoden. På grunn av vurderingsgrenser og ytelsesadministrasjonsproblemer er Twitter API svært avhengig av effektive og pålitelige cron-oppgaver. Så det er et godt eksempel å dele med deg.
Før jeg begynner, vil jeg gjenta: Jeg er alltid takknemlig for dine ideer og tilbakemeldinger. Hvis du har et spørsmål eller et emneforslag, vennligst legg inn dine tanker i kommentarene nedenfor. Du kan også nå meg på Twitter @ reifman direkte.
Wikipedia beskriver cron som "en tidsbasert jobbplanlegger i Unix-lignende datoperativsystemer." Og det er ganske nøyaktig. I utgangspunktet driver cron alle bakgrunnsoppgaver vi trenger for å kjøre webtjenester, fra loggbehandling og sikkerhetskopier til API-forespørsler til databaseopprydding.
For å se dine eksisterende cron-jobber på en server skriver du vanligvis sudo crontab -l
og se noe slikt:
# Rediger denne filen for å introdusere oppgaver som skal drives av cron. # # Hver oppgave å kjøre må defineres gjennom en enkelt linje # som indikerer med forskjellige felt når oppgaven skal kjøres # og hvilken kommando som skal kjøres for oppgaven # # For å definere tiden du kan gi konkrete verdier for # minutt (m ), time (h), dag i måneden (dom), måned (mån), # og ukedag (dow) eller bruk '*' i disse feltene (for 'noen'). # # Legg merke til at oppgavene vil bli startet basert på crons system # demonens oppfatning av tid og tidssoner. # # Utgang av crontabjobben (inkludert feil) sendes via # email til brukeren som crontabfilen tilhører (med mindre omdirigert). # # For eksempel kan du kjøre en sikkerhetskopi av alle brukerkontoene dine # klokken 5 hver uke med: # 0 5 * * 1 tar -zcf /var/backups/home.tgz / home / # # For mer informasjon se manuelle sider med crontab (5) og cron (8) # # mh dom mon dow kommando * / 3 * * * * wget -O / dev / null http://meetingplanner.io/daemon/frequent * / 15 * * * * wget -O / dev / null http://meetingplanner.io/daemon/quarter 0 * * * * wget -O / dev / null http://meetingplanner.io/daemon/hourly 15 1 * * * wget -O / dev / null http://meetingplanner.io/daemon/overnight 40 2 * * * / usr / sbin / automysqlbackup 15 3 * * 5 wget -O / dev / null http://meetingplanner.io/daemon/weekly 30 2 * * 1 / opt / letsencrypt / letsencrypt-auto forny >> /var/log/le-renew.log
Den venstre side angir å aktivere disse oppgavene hver 3. eller 15. minutt eller daglig ved midnatt, etc., og på høyre side er skriptet å løpe. Se også Planleggingsoppgaver med Cron Jobs (Envato Tuts +).
Legg merke til hvordan Let's Encrypt-skriptet er en unik konsollkommando. Den går fra kommandolinjen på serveren vår. Men alle mine møteplanleggeroppgaver ovenfor kjører via wget. Det virker som om en robot var i en nettleser på et bestemt tidspunkt som kjører forespørsler mot vårt webprogram som utfører bakgrunnsoppgaver.
I tillegg til overhead som en ekstern webforespørsel krever og tidsbegrensninger på skript på servere, må du sikre disse tilgangspunktene. Her er et eksempel på hvordan Meeting Planner gjør det:
// Bare cron-jobber og administratorer kan kjøre denne kontrollørens handlinger offentlig funksjon førAction ($ action) // din egendefinerte kode her, hvis du vil at koden skal kjøre før handlingfiltre, // som utløses på [[EVENT_BEFORE_ACTION]] arrangement, f.eks PageCache eller AccessControl hvis (! Foreldre :: beforeAction ($ action)) return false; // andre tilpassede kode her hvis (($ _SERVER ['REMOTE_ADDR'] == $ _SERVER ['SERVER_ADDR']) || (! \ Yii :: $ app-> user-> isGuest && \ common \ models \ Bruker :: findOne (Yii :: $ app-> user-> getId ()) -> isAdmin ())) return true; returner falsk; // eller feil å ikke kjøre handlingen
Det bekrefter at brukeren enten er logget inn som administrator eller kjører lokalt på serveren på en identisk Internett-IP-adresse.
Alex Makarov, en av de ledende frivillige bak Yii Framework-utviklingen, har vært nyttig å svare på spørsmål for meg, da jeg regelmessig skriver om rammen for Envato Tuts +. Etter å ha lest min sikkerhetsepisode spurte han hvorfor jeg ikke brukte Yii2s innebygde konsollskapasitet for cron-jobber. I utgangspunktet visste jeg ikke om det.
Akkurat som jeg hadde en /frontend/controllers/DaemonController.php, opprettet jeg en /console/controllers/DaemonController.php. For denne opplæringen vil jeg gjøre dette for den enklere, enklere Twixxr webtjenesten.
Jeg er vant til å bruke konsollen for å kjøre databasemigrasjoner (f.eks. ./ yii migrere / opp 7
), men det er alt. Jeg var ivrig etter å prøve å bruke den til bakgrunnsoppgaver.
Som jeg skrev om i en tidligere opplæring, krever det nyfødte nettstedet Twixxr omfattende bakgrunnsprosesser for å regelmessig rotere API-anrop for alle brukerens forespørsler om å bli venner med innflytelsesrike Twitter-kontoer holdt av kvinner.
Slik ser hjemmesiden ut:
Så jeg trodde Twixxr ville lage en flott testbed for å kjøre en konsollbasert cron-kontroller.
Her er kjernen i min nye konsollbaserte DaemonController.php:
prosess ($ TIME_START); $ time_end = mikrotime (sant); ekko 'Behandling for'. ($ time_end- $ time_start). ' sek; offentlig funksjon actionQuarter () // kalt hver femten minutter $ x = new \ frontend \ models \ Twixxr (); $ X-> loadProfiles (); offentlig funksjon actionHourly () // hver time $ current_hour = date ('G'); hvis ($ current_hour% 4) // hver fjerde time hvis ($ current_hour% 6) // hver seks timer
Legg merke til at det er ganske identisk med strukturen til min front-end-baserte kontroller, men den er sikkert utilgjengelig for nettet fordi den er i / konsolltreet. Ingen Apache webserver-side er konfigurert til å bla gjennom dette området.
Så, i eksemplet ovenfor, actionFrequent ()
vil bli kalt hver to til tre minutter. Den behandler et annet sett med Twixxr vennskapsforespørsler. På den andre siden, actionQuarter ()
blir kalt hvert 15. minutt og oppdaterer profilinformasjonen for nettleserkontoer. La oss se på hvordan planleggingen fungerer i cron-filen.
I hovedsak, i min crontab-fil, erstatter jeg wget med et direkte Linux-skript som vist ovenfor for La oss kryptere fornyelser.
Du skriver inn sudo crontab -e
å redigere eller -l
å oppgi innholdet. Her er min Twixxr cron-fil:
$ sudo crontab -l # mh dom mon dow kommando * / 3 * * * * / var / www / twixxr / yii daemon / frequent * / 15 * * * * / var / www / twixxr / yii daemon / quarter 0 * * * * / var / www / twixxr / yii daemon / time 15 1 * * * / var / www / twixxr / yii daemon / over natten 15 3 * * 5 / var / www / twixxr / yii daemon / ukentlig # 40 2 * * * / usr / sbin / automysqlbackup 30 2 * * 1 / usr / bin / letsencrypt forny >> /var/log/le-renew.log
Det er ganske enkelt. Den venstre side av / var / www / twixxr / yii daemon / hyppig
er banen der yii tolken lever, og høyre side er konsollkontrollen og metoden for å ringe.
Alt fungerte ganske bra byttet over. Jeg har ikke byttet møteplanlegger over akkurat som jeg vil gjøre mer testing. Når bakgrunnsoppgaver bryter, er det vanskelig å vite og vanskelig å feilsøke dem (selv om Sentry-feillogging hjelper mye).
Et element jeg kjørte inn i er at konsollnavnet er forskjellig fra navnet på fornavnet-for eksempel, for eksempel SiteHelper.php-komponenten jeg opprettet i opplæringen min, som beskriver å kjøre flere nettsteder fra en enkelt kodebase, mislyktes da jeg påkalte den. Fjerning av det fungerte, men jeg trengte å kjøre tester for å sørge for at den underliggende bakgrunnskoden fortsatt fungerte. Men for det meste gikk overgangen jevnt.
Som med hvilken som helst annen kodeendring, test og monitor grundig.
Når jeg ser fremover, vil jeg undersøke å bygge REST-APIer i Yii2 Framework, som avhenger tilfeldigvis av å skape et distinkt sub-tre som konsolltreet, men for eksterne APIer. Selvfølgelig medfører dette komplekse godkjennings- og sikkerhetsproblemer ... så det vil være morsomt å utforske disse med deg. Jeg ser på APIer fra flere vinkler. Jeg er faktisk ganske spent på dette.
Se etter kommende opplæringsprogrammer i min programmering med Yii2-serien når jeg fortsetter å dykke inn i ulike aspekter av rammen. Vennligst også undersøk bygningen din oppstart med PHP-serien, som dokumenterer prosessen med å bygge Simple Planner og Meeting Planner.
Hvis du vil vite når neste Yii2 opplæring kommer, følg meg @ reifman på Twitter eller sjekk min instruktørside for oppdateringer.