Artikel top billede

(Foto: Computerworld)

Så er det slut med at glemme noget

Hold dig ajour ved at sende påmindelser til dig selv.

Af Redaktionen, Alt om Data

Denne artikel er oprindeligt bragt på Alt om Data. Computerworld overtog i november 2022 Alt om Data. Du kan læse mere om overtagelsen her.

Det er slet ikke så tosset med en lille ”hjælper”, der kan være med til at huske for en. Påmindelsesværktøjet er ved at tage sin form. Sidst gennemgik vi, hvordan du opretter påmindelser, og nu skal vi så have afsluttet vores lille serie.

Vi skal bruge endnu et program til at gøre opmærksom på påmindelser. Det tjekker datafilen og udsender meddelelser, når tiden er inde. I stedet for at have en dæmon-proces kørende i baggrunden kalder vi simpelthen et program en gang i timen. Det udsender meddelelser, når tiden er inde, og så lukker det. Det sparer ressourcer.

I denne sammenhæng virkede det som en god ide at støtte den hurtigt voksende Twitter-tjeneste og e-mail til afsendelse af påmindelserne. Når man vil bruge den ene eller dem begge, sætter man de følgende tre linjer i begyndelsen af programfilen ”alert.php” (hvis man vælger ikke at bruge en tjeneste, skal man kommentere de pågældende linjer ud ved at sætte to skråstreger foran):

<?php
$twitteruser=”mytwitterhandle ”;
$twitterpass=”twitterpassword ”;
$email=”me@mydomain.co.uk ”;

I det næste segment skal vi finde ud af tidspunkt og dato, så de kan holdes op mod påmindelsen. De første fire linjer bruger funktionen ”date()” til at returnere zero-padded værdier (når det er nødvendigt) for alle værdierne for tid, dato, måned og år:

$time=date(“H:00”);$day=date(“d”);
$month=date(“m”);
$year=date(“Y ”);
if (!file_exists(“reminders.dat”)) die(“(none)”);
$fp=fopen(“reminders.dat ”,”r”);

Nu bliver det undersøgt, om filen reminders.dat eksisterer. Gør den ikke det, er der ikke noget at gøre, og programmet lukker. Pas på her: Varslingsprogrammet kører ikke nødvendigvis fra den mappe, der indeholder datafilen, og derfor lukker den altid. Det kan derfor anbefales at angive filens nøjagtige placering på serveren, snarere end blot filnavnet. Det bør se omtrent sådan ud:

/usr/local/www/reminders.dat

Nu kommer vi til den mere solide del af programmet, der afgør, om der skal sendes en påmindelse:

while (!feof($fp)){
$entry=trim(fgets($fp));
$parts=explode(“|”,$entry);
if ($parts [0 ]==“”)die();
$dow=date(“N”,mktime(0,0,0,$parts [3],$parts [2],$parts [4]));
$send=0;

For at sætte den i gang indlæser vi den nu åbne datafil en linje ad gangen og eksploderer felterne ind i array’et $parts[], ligesom med programmet remind.php. Hvis en NULL-$parts[0] bliver fundet, er man nået til programmets slutning, og det lukker.

Ellers tager vi et tjek på påmindelse-dataene for at finde ud af, hvilken ugedag den blev sat til. Det gør man ved at sende værdierne for dato, måned og år til funktionen ”mktime()”. Den returnerer et Unix-tidsstempel, der bliver videregivet til funktionen date(), som returnerer et tal mellem 1 og 7 for ugedagen.

Til sidst sætter vi en variabel ved navn ”$send” til nul. Hver gang en påmindelse skal afsendes, bliver denne variabel sat til 1, parat til at blive tjekket af den kodedel, der udsender påmindelser.

Påmindelser skal behandles

Den følgende kode bliver kørt i den tidligere oprettede løkke. Den begynder med at tjekke, om den aktuelle time er den samme som den i påmindelsen og fortsætter kun, hvis det er tilfældet. Det betyder, at det første kriterium er opfyldt:

if ($time ==$parts [1]){switch($parts [5]){
case “Daily”:$send=1;break;
case “Weekly”:if ($dow == date(“N”)){$send=1;break;}
case “Monthly”:if ($day == $parts [2]){$send=1;break;}
case “Annually”:if ($day == $parts [2]&&$month ==$parts [3]){$send=1;break;} case “Once”:if ($day ==$parts [2]&& $month ==$parts [3]&&$year == $parts [4]){$send=1;break;}
}}

Dernæst bliver en “switch()”-struktur brugt til at tjekke hver type påmindelse (daglig, ugentlig, månedlig, årlig eller en gang). Til daglig kan vi sætte variablen $send til 1 med det samme, for vi ved, at vi har nået det korrekte tidspunkt på dagen.

Til ugentlig tjekker vi simpelthen, om den aktuelle dag er den samme, som vi regnede med i det forrige kodesegment fra påmindelsesdataene. Hvis det er tilfældet, bliver $send sat til 1. Til månedlig bliver $send sat til 1, hvis dagen på måneden er den samme som påmindelsen. Til årlig bliver $send kun sat til 1, hvis dagen i dag er den rigtige dag og måned. Til en gang skal i dag være samme dag, måned og år, før den bliver sat til 1.

Afsende påmindelser

Nu mangler vi kun at tjekke variablen $send og, hvis den er sat, at sende påmindelsen:

if ($send ==1){if ($twitteruser !=“”) twitter($twitteruser,$twitterpass,
$parts [0 ]); if ($email !=“”) mail($email,”Reminder Service ”,$parts [0],”From:$email r n ”);}

Når $sent har værdien 1, tjekker denne kode variablerne $twitteruser and $email. Hvis en af dem har en non-NULL-værdi, bliver påmindelsen sendt ved hjælp af denne tjeneste.

Når det gælder e-mail, er det meget enkelt: Man kalder funktionen ”mail()” og giver den en e-mail-adresse, emnet og selv påmindelsen plus afsenderadressen. Denne kode går også ud fra, at udgående e-mail kan sende fra serveren.

Send påmindelser til Twitter

Til Twitter er man nødt til at skrive et sidste stykke kode, der kan tale med Twitters api:

function twitter($un,$pw,$ms){
$url=http://twitter.com/statuses/update.xml;
$curl_handle=curl_init();
curl_setopt($curl_handle,CURLOPT_URL,”$url ”);
curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2);
curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl_handle,CURLOPT_POST,1);
curl_setopt($curl_handle,CURLOPT_POSTFIELDS,”status=$ms ”);
curl_setopt($curl_handle,CURLOPT_USERPWD,”$un:$pw ”); $buffer=curl_exec($curl_handle);
curl_close($curl_handle);}

Denne funktion tager et Twitter-brugernavn og kodeord og en besked som sine parametre, før meddelelsen bliver sendt til den pågældende Twitterkonto. Vær opmærksom på, at der ikke sker noget fejltjek her, idet det formodes, at man skriver Twitterdetaljerne korrekt ind. Hvis ens PHP-implementering udløser en fejlmeddelelse her, skal man sandsynligvis sikre sig, at modulet ”Mod Curl er føjet til ens PHP-installation.

Alt, hvad man skal gøre, er at anbringe alle disse segmenter (i rækkefølge) i en fil ved navn ”alert.php” og gemme den på serveren samme sted som remind.php (eller kopiere den fra www.aod.dk/download).

Opsætning af en Cron

Til at kalde programmet alert.php hver time skal vi bruge Cron, der er en tidsbaseret kalendertjeneste. Til det formål skal man installere Telnet eller SSH på sin server og navigere til den mappe, hvorfra man skal køre påmindelsesværktøjet.

Så skal man uddrage den aktuelle liste over Cron-opgaver i en fil ved at skrive det følgende:

crontab –l >cron file.txt

Herefter skal man føje en ny linje til slutningen af “cronfile.txt”:

0 ****/usr/local/bin/php /usr/local/www/alert.php >/dev/null 2>&1

Kommandoen “>/dev/null 2>&1” beder serveren ignorere eventuelle output fra programmet og køre det i baggrunden. Når man har tilføjet denne linje, skal man gemme den modificerede fil og udføre den følgende kommando:

crontab cron file.txt

Nu kan man erstatte ”/usr/local/bin/php” med den korrekte programplacering. Man bør også angive stien til filen alert.php.

Og så har man et komplet påmindelsesværktøj til både e-mail og Twitter, rummet i nogle få, enkle linjer kode.

[themepacific_accordion]
[themepacific_accordion_section title="Fakta"]

Sådan skal du gøre...

[/themepacific_accordion_section]
[themepacific_accordion_section title="Fakta"]

Det skal du bruge...

[/themepacific_accordion_section]
[themepacific_accordion_section title="Fakta"]

Ressourcer

[/themepacific_accordion_section]
[/themepacific_accordion]