Dar vieno analitiko svetainė

Petras Kudaras

Perlinis alarm()

Turėjau šiokių problemų su perlific, mat jeigu jis kurį
laiką nevykdydavo jokios MySQL užklausos, MySQL uždarydavo ryšį su perlu
ir duomenų bazė tapdavo nebepasiekiama. Norint išlaikyti atvirą jungtį
su MySQL reikia kas kažkiek laiko papinginti duombazę
iškviečiant $dbh->ping();. Tai galima padaryti keleta
būdu (juk čia Perlas): fork()‘int ir atskirame procese
daryti while(1) { sleep(60); $dbh->ping(); }, galima
naudotis gijomis (jei Perlas kompiliuotas su jomis) – use<br /> threads;, galima apsirašyti funkciją on_ping (nes juk
tai IRC botas). Padariau dar kitaip. Štai tas kodas:

$SIG{ALRM} = \&on_alarm;
alarm(60);
sub on_alarm {
        $dbh->ping;
        $SIG{ALRM} = \&on_alarm;
        alarm(60);
}

Šis kodo gabaliukas aprašo funkciją, kuri turi būti iškviečiama kai
gaunamas sisteminis signalas SIGALARM. Paskui su alarm(60)
nurodoma operacinei sistemai kad ji praneštų kai praeis 60 sekundžių.
Pačioje funkcijoje reikia iš naujo nurodyti SIGALARM funkciją ir laiko
tarpą. Gaunasi poor man’s multithreading.