Lock

Subsystém zámků slouží k zajištění synchronizace různých systémových procesů a robotů. Příkladem může být například synchronizace dat, nebo například přepočet cen na e-shopu. Jde o procesy, které jsou periodicky spouštěné, mohou trvat delší dobu a zároveň je nevhodné, aby se jiný takový proces spustil, zatímco jiný běží.

Jako vše v PHP Jet je i tento systém modulární. V aplikaci se používá velice jednoduchá a snadno použitelná fasáda a za ní je modul backendu, který lze snadno rozšířit, nahradit či vytvořit zcela individuální implementaci.

Použití zámků

Existují dvě možnosti, jak použít zámek: Okamžitý zámek a vyčkávací zámek.

Okamžitý zámek se pokusí zamknout daný proces, a pokud to není možné (zámek drží již jiný běžící proces), tak okamžitě vrací hodnotu false a je na aplikaci, aby ošetřila situaci, kdy nemůže získat zámek – tedy nejpravděpodobněji vypsala hlášení a ukončila proces.

Zde je příklad použití:

use Jet\Lock;

if(!
Lock::lockIfPossible'example-lock' )) {
    die(
"Unable to lock. End.\n");
}

echo 
"Got lock, working ...\n";
for(
$c=0;$c<30;$c++) {
    echo 
$c.".";
    
sleep(1);
}
echo 
"\n\nDone - unlock\n";

Lock::unlock'example-lock' );

Vyčkávací zámek se pokusí zamknout, ale pokud se to nepovede, tak to zkouší znova. Ovšem má zároveň definovaný časový limit, po který může na zámek čekat. Pokud se nepodaří zámek získat ani po uplynutí daného limitu, opět vrací false a aplikace stejně jako v předchozím případě by měla například ukončit daný proces.

Zde je opět příklad použití:

echo "Waiting for lock ....\n";

if(!
Lock::waitForLock'example-lock'10 )) {
    die(
"Unable to lock. End.\n");
}

echo 
"Got lock, working ...\n";
for(
$c=0;$c<30;$c++) {
    echo 
$c.".";
    
sleep(1);
}
echo 
"\n\nDone - unlock\n";

Lock::unlock'example-lock' );

Jak je patrné z příkladů, tak odemknutí zámku se provádí jednoduše voláním metody Lock::unlock( 'example-lock' ); ovšem to není vše. Systém má ochranu proti mrtvým zámkům.

První stupeň ochrany je, že jako takzvaná shutdown funkce se při získání zámku vždy registruje funkce, která zabezpečí odemčení zámku. Tím se řeší situace, kdy proces z nějaké nepředvídatelné příčiny selže, takzvaně spadne, a mít v systému mrtvý zámek by mohlo znamenat problémy.

Druhým stupněm ochrany již řeší samotné backendy zámků. Backend jako například Jet\Lock_Backend_MariaDB má nastaven maximální časový limit, po který může konkrétní zámek držet zamčený.

Konfigurace subsystému zámků

Základní konfigurace je určení, jaký backend se bude o zámky starat. Toto se provádí takto v inicializačním skriptu application/Init/Lock.php

use Jet\Lock;
use 
Jet\Lock_Backend_MariaDB;

Lock::setLockBackendClassLock_Backend_MariaDB::class );

Zámky jsou nízkoúrovňová záležitost, co by měla mít minimální latenci. Tedy standardně se jedná o velice jednoduchý a především samostatný systém. Proto je konfigurace takto nezávislá a přímočará.

Předchozí kapitola
Jet\BaseObject_Interface_Serializable_JSON
Další kapitola
Jet\Lock