php deamon készítése

Egy SMS gateway-al kommunikáló démont kellett írnom, fejlesztéshez a PHP-t választottam, mert az első tesztek után úgy tűnt, hogy teljesen jól bírja démonként a gyűrődést, nem kezd el rakoncátlankodni és minden funkció elérhető belőle amire szükségem volt.

A “démonomnak” annyit kellett tudnia, hogy egy PHP-ból (www-data-ként futtatott PHP-ból) küldött felhasználói szignál esetén átfésülje az adatbázist és beállítson néhány státuszt – ez utóbbi mellékes, hiszen itt most csak a démon belső felépítése a fontos.

#!/usr/bin/env php

<?php

$sFileName = “/var/run/DEAMONOMMAPPAJA/DEAMONOM.pid”;

if ( file_exists( $sFileName ))
{
$PrevPid = file_get_contents($sFileName);
}

if( isset( $PrevPid) && (int)$PrevPid > 0 )
{
posix_kill ( $PrevPid, SIGUSR1 );
echo “Error: Deamon is already running with PID: $PrevPid\n\n”;
exit;
}
else
{
echo “\nStarting deamon…\n”;
declare( ticks = 1 );
$pid = pcntl_fork();
if ($pid == -1)
{
die(“could not fork”);
}
else if ( $pid)
{
exit;
}

$posid = posix_getpid();

pcntl_signal( SIGTERM, “sig_handler”);
pcntl_signal( SIGHUP, “sig_handler”);
pcntl_signal( SIGUSR1, “sig_handler”);

$fp = fopen( $sFileName, “w+”);
fwrite( $fp, $posid );
fclose( $fp);

//demaon ciklus
while ( 1 )
{
sleep(12);
}

if ( posix_setsid() == -1)
{
die(“Could not detach from terminal”);
}
}

//signal handler
function sig_handler( $signo)
{
switch ( $signo )
{
case SIGTERM:
echo “SHUTDOWN”;
$sFileName = “/var/run/DEAMONOMMAPPAJA/DEAMONOM.pid”; //ezt itt is definiálni kell…
if ( file_exists( $sFileName ) )
{
unlink ( $sFileName ); //EXIT esetén törlöm a PID fájlt
}
exit;
break;
case SIGHUP:
break;
case SIGUSR1: //ha ilyet kap és már fut, akkor küld saját magának egy SIGNALT
smsgate();break; //ez végi az sms gateway-al a kommunikációt
default:
}
}

Látható, hogy a /var/run/DEAMONOMMAPPAJA/DEAMONOM.pid fájlba lementünk egy egyszerű PID-et, amit azután ki tudunk olvasni bármilyen alkalmazással – akár egy másik PHP alkalmazásból is 🙂 és ezzel az azonosítóval tudunk például jelet küldeni a démonunknak.

Ezek a konstansok vannak definiálva a PHP-ban:

http://www.php.net/manual/en/pcntl.constants.php

Én egy statikus metódusból küldtem a jelemet a démonnak, ennek elkapása esetén ellenőriznie kell, hogy van-e új sor egy adatbázis táblában, ha igen, akkor végezze el a szükséges fealadatokat (kommunikáció egy SMS gateway-al, az onnan kapott XML-ek feldolgozása stb.), a démon felé szignált küldő, picit lecsupaszított metódus valahogy így néz ki:

public static function sendSignal()
{
$sProjectDir = dirname( realpath( $_SERVER[‘DOCUMENT_ROOT’] ));
$sExecutedDeamon = $sProjectDir.”/bin/deamonom.php”; //EZ A démon elérési útja, a projekten belül egy bin könyvtárba tettem.
if ( file_exists( $sExecutedDeamon ) )
{
$sCommand = $sExecutedDeamon;
exec( $sCommand, $r ); //meghívom a démont, ami ha már fut belőle egy példány akkor meghívja saját magát egy SIGUSR1 szignállal
}
}

Látható, hogy egy egyszerű PHP-s exec() függvénnyel hívtam meg a démont, ehhez az kell, hogy deamonom.php-ra legyen a www-data felhasználónak futtatási joga és a deamon.php-ról pedig tudnia kell az operációs rendszernek, hogy ez egy futtatható fájl és, hogy mivel kell futtatnia, így a forráskód fölé be kell szúrni a következő utasítást:

#!/usr/bin/env php

(A <?php rész elé…)

Röviden ennyi lett volna, ez egy nagyon egyszerű struktúra, de szerintem ennél nincs szükség bonyolultabbra, mert egy szerviznek (démon) rövidnek, tömörnek és stabilnak kell(ene) lennie. 🙂

u.i.:
A feladatot úgy is meg lehetett volna oldani, hogy a démon pl. 1 percenként megnézi egy szöveges fájlban, hogy vannak-e várakozó sorok és ha igen akkor csatlakozik az adatbázishoz és megcsinálja a feladatot, de a SIGNAL küldéses megoldás nekem erőforrás takarékosabb megoldásnak tűnt.

A Cron-al időzített megoldás is megfordult a fejemben, de így utólag kiráz a hideg ettől 🙂 – bbbrrr, egy Cron szkript 1 percenként meghív egy PHP-t…rémálom!

This entry was posted in Uncategorized. Bookmark the permalink.

2 Responses to php deamon készítése

  1. Bence says:

    Szia!George Schlossnagle féle – PHP fejlesztés felsőfokon PHP könyvet olvasgatom, ott jó kis elméleti alapok vannak, de ez a példa segített átlátni a működést és a működés lehetséges céljait. Köszi

  2. j. says:

    Szia,örülök, hogy hasznos volt számodra ez a bejegyzés! 🙂

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s