Files
EQN/appServer/test_sam.php
T

121 lines
3.6 KiB
PHP

<h1>EQN</h1>
<i>Testing procedure Redis per EQN...</i><hr/>
<?php
require 'redis.php';
require 'stopWatch.php';
# avvio misura tempi...
StopWatch::start();
function redis_error($error) {
// throw new error($error);
}
$redis = new redis_cli ();
$redis->connect("redis01");
$redis->set_error_function('redis_error');
#------------------------------------------------------
# VALORI DI CONFIGURAZIONE (portare su file ext!!!)
#------------------------------------------------------
# ScoreList Posizioni
$semaforo = "EQN:USERS:SEMAPHORE_TEST";
$tblPos = "EQN:USERS:POS";
$tblLast = "EQN:USERS:UPD";
$tblCanPos = "EQN:CANDIDATE:POS";
$tblCanLast = "EQN:CANDIDATE:UPD";
# timeout (x semaforo) IN SECONDI x gestione update POSIZIONI sul DB (cancello vecchi, inserisco nuovi): 60 sec (o meno...)
$tOutSem_s = 10;
# età massima dei valori a sistema (40 min x cancellare vecchi...)
$maxAge_m = 40;
# controllo se serve cleanUp
$semOk=0;
# Verifica SE ci sia semaforo rosso oppure se sia necessario a fine programma fare cleanUp
function checkSemaforo($redis, $semaforo, $tOutSem_s) {
// verifico semaforo...
$answ=$redis->cmd('EXISTS', $semaforo )->get();
// se NON c'è lo creo
if($answ==0)
{
$redis->cmd('SET', $semaforo, date("YmdHis"))
->cmd('EXPIRE', $semaforo, $tOutSem_s)
->set();
}
return $answ;
}
function my_array_diff($a, $b) {
$map = $out = array();
foreach($a as $val) $map[$val] = 1;
foreach($b as $val) if(isset($map[$val])) $map[$val] = 0;
foreach($map as $val => $ok) if($ok) $out[] = $val;
return $out;
}
# effettua pulizia degli ORFANI tabelle REDIS UTENTI (POS che eccedono gli UPD)
function cleanUpOrphan($redis, $tblPos, $tblLast) {
echo "Chiamato CleanupOrphan<hr/>";
// recupero in blocco elenco user_ID da POS e da UPD...
$answ=$redis->cmd('ZRANGE', $tblPos, 0, -1)
->cmd('ZRANGE', $tblLast, 0, -1)
->set();
$ar2del=my_array_diff($answ[0],$answ[1]);
#$ar2del=array_diff($answ[0],$answ[1]);
#print_r($ar2del);
# solo se ci sono differenze...
if(count($ar2del)>0)
{
# imposto transazione...
$redis->cmd('MULTI');
$task="";
# inizio scrittura...
for ($i = 0; $i < count($ar2del); ++$i) {
$redis->cmd('ZREM', $tblPos, $ar2del[$i]);
$task.='ZREM | '. $tblPos." | ".$ar2del[$i]."<br/>";
}
echo "Effettuata pulizia tabella:<br/>".$task."<br/>";
# chiamo vera esecuzione transazione
$redis->cmd('EXEC')->set();
}
else
{
ECHO "Tabelle allineate, nulla da cancellare...";
}
}
# conta quanti record ci siano nelle tab indicata
function cntRec($redis, $tblReq) {
// conteggio!
$answ=$redis->cmd('ZCOUNT', $tblReq, '-inf', '+inf')->set();
// ritorno valore
return $answ[0];
}
# in primis check semaforo SE debba fare pulizia
$semOk=checkSemaforo($redis, $semaforo, $tOutSem_s);
# verifico semaforo $tOutPos2Db (se devo svuotare redis)
if($semOk==0)
{
# effettuo scan dei CANDITATE POS, se NON li trovo in UPD li ELIMINO...
cleanUpOrphan($redis, $tblCanPos, $tblCanLast);
}
# mostro infine count record rimasti!!!
$num1=cntRec($redis, $tblLast);
$num2=cntRec($redis, $tblPos);
$num3=cntRec($redis, $tblCanLast);
$num4=cntRec($redis, $tblCanPos);
echo "<hr/>Check EQN:USERS: ".$num1." valori in ".$tblLast." | ".$num2." valori in ".$tblPos."<br/>";
echo "<hr/>Check EQN:USERS: ".$num3." valori in ".$tblCanLast." | ".$num4." valori in ".$tblCanPos."<br/>";
echo "Elapsed time (ms): ".StopWatch::elapsed()." <br/>";
// esempio:
// http://srv.earthquakenetwork.it/test_redis.php
// https://github.com/ziogas/PHP-Redis-implementation
// https://stackoverflow.com/questions/33196237/how-to-set-expire-when-using-redis-geoadd
// https://redis.io/commands/zremrangebyrank
?>