UNIXowy Demon w PHP, cz. 2

Autor: Michał Seth Gołębiowski, dodano: 19-08-2009
Kategoria: Programowanie i tworzenie

Część druga publikacji o demonie UNIXowym, która prezentuje całą stworzoną przez nas klasę oraz plik inicjujący demona.

Ostateczny wygląd naszej klasy

Po zebraniu wszystkiego do kupy i napisaniu metody _doTask() cała klasa wygląda następująco (plik OnetNewsDaemon.class.php):

<?php
require_once('phpmailer/class.phpmailer.php');

class OnetNewsDaemon extends Daemon {
    var $rssUrl    = '';
    var $sleepSec  = 60;
    var $newsCount = 3;

    var $smtpHost       = '';
    var $smtpUser       = '';
    var $smtpPass       = '';
    var $senderEmail    = '';
    var $senderName     = '';
    var $recipientEmail = '';

    var $pidFileLocation = '/tmp/ondaemon.pid';


    function _doTask() {
        $newsList = $this->_getNewsList($this->newsCount);

        if ($newsList !== false) {
            $this->_sendMail(implode("n", $newsList));
        }


        sleep($this->sleepSec);
    }

    function _getNewsList($limit = 3) {
        $newsList = array();

        $result = preg_match_all('/<title>(.*)</title>/Umi', @file_get_contents($this->rssUrl), $match);

        if ($result) {
            for ($i = 1; $i < $limit; $i++) {
                $newsList[] = $this->_clearPolishChars($match[1][$i]);
            }

            return $newsList;
        } else {
            return false;
        }
    }

    function _clearPolishChars($text) {
        $pl = array (
            '&#260;' => 'A',
            '&#261;' => 'a',
            '&#262;' => 'C',
            '&#263;' => 'c',
            '&#280;' => 'E',
            '&#281;' => 'e',
            '&#321;' => 'L',
            '&#322;' => 'l',
            '&#323;' => 'N',
            '&#324;' => 'n',
            '&#211;' => 'O',
            '&#243;' => 'o',
            '&#346;' => 'S',
            '&#347;' => 's',
            '&#377;' => 'Z',
            '&#378;' => 'z',
            '&#379;' => 'Z',
            '&#380;' => 'z'
        );

        return strtr($text, $pl);
    }

    function _sendMail($text) {
        static $mail = null;

        if (!$mail) {
            $mail = new PHPMailer();

            $mail->Host     = $this->smtpHost;
            $mail->Mailer   = 'smtp';

            $mail->From     = $this->senderEmail;
            $mail->FromName = $this->senderName;
            $mail->AddAddress($this->recipientEmail, $this->recipientEmail);

            $mail->Subject  = 'OnetNewsDaemon';
        }

        $mail->Body = $text;

        return $mail->Send();
    }
}
?>

 

Zauważmy, że wewnątrz metody _doTask() wykonaliśmy funkcję sleep(). Zrobiliśmy tak gdyż metoda _doTask() jest wykonywana cały czas w pętli (do zamknięcia demona). Naszym celem jest wysyłanie wiadomości co godzinę, więc musimy na pewien czas zatrzymać działanie skryptu.

Plik inicjujący demona

Mając już gotową klasę naszego demona musimy jeszcze tylko stworzyć plik, który zainicjuje nam program. Stworzymy więc prosty skrypt tworzący instancje naszej klasy OnetNewsDaemon i ustawiający parametry wiadomości.

Plik wyglądać będzie tak (ondaemon.php):

<?php
$onetNewsDaemon = new OnetNewsDaemon();

$onetNewsDaemon->smtpHost       = ''; // Adres serwera SMTP
$onetNewsDaemon->smtpUser       = ''; // Nazwa uzytkownika
$onetNewsDaemon->smtpPass       = ''; // Haslo

$onetNewsDaemon->senderEmail    = ''; // Email nadawcy
$onetNewsDaemon->senderName     = ''; // Nazwa nadawcy

// Aby wyslac SMS na adres w sieci Plus GSM nalezy wpisac adres w postaci:
// +48xxxxxxxxx@text.plusgsm.pl
// gdzie X-y zamieniamy na numer telefonu w sieci Plus GSM.
// Jezeli nie posiadamy telefonu w Plus GSM to zostaje nam podanie swojego
// prywatnego numeru e-mail i tam wyslanie newsow.
$onetNewsDaemon->recipientEmail = ''; // Email odbiorcy

// Startujemy naszego demona
$onetNewsDaemon->start();
?>

 

Opisałem wszystkie zmienne więc pozostaje nam tylko wpisać swoje ustawienia i uruchomić demona.

Budzimy demona do życia

Aby uruchomić demona musimy z poziomu konsoli systemowej wykonać następującą komendę:

php ondaemon.php


Aby zobaczyć czy nasz demon działa wystarczy wyświetlić listę procesów używając komendy:

ps x

Tak wygląda to u mnie:


 

 

Aby zakończyć prace demona wystarczy wykonać komendę:

kill <Numer PID demona>

 

W moim przypadku będzie to:

kill 6788

 

A tak oto prezentuje się SMS z listą najświeższych newsów na ekranie telefonu komórkowego:

 

 

Podsumowanie

Stworzyliśmy działający i co najważniejsze praktyczny przykład wykorzystania demona UNIXowego. Możliwości jakie otwierają się przed nami są praktycznie nieograniczone. Po przez własny serwer WWW, po skrypt monitorujący zmianę dynamicznego IP, temperaturę procesora, udostępniający mechanizmy zcentralizowanego logowania, skończywszy na mechanizmie parzenia kawy i robieniu śniadania do łóżka.

Wszystko to może nam zapewnić demon, a dzięki wykorzystaniu PHP stworzenie jego jest dużo bardziej proste niż zagłębianie się w tajniki C/C++


Przedstawiany w tym artykule przykład dostępny jest do ściągnięcia pod adresem: http://www.webarchitect.pl/work/art/wi/php_unix_demon/

 

Podziękowania

Pozwolę sobie na odrobinę prywaty i podziękuję Maruszowi za podsunięcie pomysłu na przykładowego demona i użyczenie swojego telefonu komórkowego do testów.

 

 

Ocena 2.53/5 (50.62%) (452 głosów)

Komentarze:

  • !
    Dodał: Gość data: 2011-03-22
    Bardzo ciekawy artykuł, wyjaśnił wszystko choć w praktyce jeszcze nie przetestowałem.


Dodaj komentarz:


Temat:
Twój nick:
Komentarz:
 

Prosimy o kulturę wypowiedzi. Komentarze zawierające niecenzuralne zwroty, bądź obrażające inne osoby będą usuwane. Kod HTML w wypowiedziach jest niedozwolony. Wydawca nie odpowiada za treść komentarzy.