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
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.

Comments Closed

4 Comments

  1. nu jo txt… krustis per antra gala…. keista aisku tas, kad kuri laika nieko nedarant konektas dingsta… na bet perle nelabai nusimanau taigi….. :)

  2. Na ta jungtis dingsta po kokių poros ar dar daugiau valandų. Šiaip ganėtinai logiška.

    Dabar perlific jau gyvas penkta para ir ryšio su duombaze neprarado.

Comments are closed.