EQN

Testing procedure Redis per EQN...
connect("redis01"); $redis->set_error_function('redis_error'); $server = gethostname(); echo "Server ".$server." inizializzato, proseguo test
"; #------------------------------------------------------ # VALORI DI CONFIGURAZIONE (portare su file ext!!!) #------------------------------------------------------ # ScoreList Posizioni $semaforo = "EQN:USERS:SEMAPHORE"; $tblPos = "EQN:USERS:POS"; $tblLast= "EQN:USERS:UPD"; # timeout (x semaforo) IN SECONDI x gestione update POSIZIONI sul DB (cancello vecchi, inserisco nuovi): 1 min (poi 5?) $tOutSem_s = 15;//30; # età massima dei valori a sistema (40 min x cancellare vecchi...) $maxAge_m = 40; // # num record da processare in blocco // $nBlockRec = 10; # controllo se serve cleanUp $semOk=0; # Salva posizione utente function salvaPosizione($redis, $tblPos, $tblLast, $User_ID, $Lat, $Lon, $DTime) { # salvo dataora verifica $redis->cmd('ZADD', $tblLast, $DTime, $User_ID ) // # salvo posizione Geolocalizzata ->cmd('GEOADD',$tblPos, $Lon, $Lat, $User_ID ) ->set(); } # 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("YmdHi")) ->cmd('EXPIRE', $semaforo, $tOutSem_s) ->set(); } return $answ; } # effettua pulizia tabelle REDIS UTENTI (POS e UPD) function cleanUp($redis, $tblPos, $tblLast, $DTime) { echo "DTime Max: ".$DTime."
"; // recupero in blocco elenco user_ID vecchi... $answ=$redis->cmd('ZRANGEBYSCORE', $tblLast, 0, $DTime) ->set(); #var_dump($answ); #var_dump($answ[0]); // costruisco stringa comando x dati GEO vecchi $array=$answ[0]; # imposto transazione... $redis->cmd('MULTI'); # inizio scrittura... for ($i = 0; $i < count($array); ++$i) { # echo $answ[0][$i]."
"; $redis->cmd('ZREM', $tblPos, $answ[0][$i]);//->set(); } // costruisco stringa comando x calcellazione dati vecchi DTime $redis->cmd('ZREMRANGEBYSCORE', $tblLast, 0, $DTime);//->set(); # chiavo vera esecuzione transazione $redis->cmd('EXEC')->set(); // // cerco i dati NUOVI (per DB) da persistere su DB $nBlockRec alla volta... // // insert into notifications_redis (enabled,user_id,latitude,longitude) values (1,$user_id,$user_latitude,$user_longitude) // // enabled non serve più ma è settato a 1 per compatibilità all'indietro. Per estrarre è // // select user_id,latitude,longitude from notifications_redis // $ini = parse_ini_file("conf.ini", true); // mysql_connect($ini['db']['host'],$ini['db']['user'],$ini['db']['pass']); // mysql_select_db($ini['db']['db']); // // elimino da DB righe vecchie... MANCA condizione tempo perché manca colonna... // $sqlDel="TRUNCATE TABLE notifications_redis;"; // #$sqlDel="DELETE * FROM notifications_redis WHERE 1=1"; // $sqlSel="SELECT user_id, latitude, longitude, data FROM notifications_redis;"; // $sqlIns=""; // // elimino da DB righe vecchie... MANCA condizione tempo perché manca colonna... // #mysql_query($sqlDel); // // inserisco TUTTE le righe nuove... // $answ=$redis->cmd('ZSCAN', $tblLast, 0)->set(); // #var_dump($answ); // $array=$answ[0]; // $tab=$array[1]; // $sqlIns .= "INSERT INTO notifications_redis(enabled,user_id,latitude, longitude, data) VALUES "; // for ($i = 0; $i < count($tab); $i+=2) { // $data=substr($tab[i+1],0,4)."-"; // $data.=substr($tab[i+1],4,2)."-"; // $data.=substr($tab[i+1],6,2)." "; // $data.=substr($tab[i+1],8,2).":"; // $data.=substr($tab[i+1],10,2); // $sqlIns .= " (1,".$tab[$i].",0,0,'".$data."'),"; // #$sqlIns .= " (1,".$tab[$i].",0,0,'".date("Y-m-d H:i")."'),"; // } // #sostituisco ultimo carattere.. // $sqlIns = substr($sqlIns, 0, strlen($sqlIns)-1).";"; // mysql_query($sqlIns); // #ECHO "
"; // ECHO $sqlIns; // // recupero TUTTE le righe utente... // $sql=mysql_query($sqlSel); // //#$counter=0; // $num_rows = mysql_num_rows($sql); // ECHO "Righe DB: ".$num_rows."
"; // mysql_close(); } # 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]; } # Genero un UID univoco con nome server (numerico) + numero casuale $uID = substr($server, 2, 2).rand(0,999999999); # genero coordinate casuali LAT/LON $cLat = rand(-84,84); $cLon = rand(-179,179); $currDT = date("YmdHi"); # in primis check semaforo SE debba fare pulizia $semOk=checkSemaforo($redis, $semaforo, $tOutSem_s); $num=cntRec($redis, $tblLast); echo"Semaforo: ".$semOk." | Trovati ".$num." valori in REDIS
"; echo "Elapsed time: ".StopWatch::elapsed()."
"; echo "
"; # effettuo update informazione posizione dell'utente (insert/update) salvaPosizione($redis, $tblPos, $tblLast, $uID, $cLat, $cLon, $currDT); echo"Valore salvato uID: ".$uID." | LAT: ".$cLat." | LON: ".$cLon." | DT: ".$currDT."
"; echo "Elapsed time: ".StopWatch::elapsed()."
"; echo "
"; # verifico semaforo $tOutPos2Db (se devo svuotare e aggiornare DB da redis) if($semOk==0) { #$maxDT = date("YmdHi",strtotime("-1 min")); $maxDT = date("YmdHi",strtotime("-".$maxAge_m." min")); cleanUp($redis, $tblPos, $tblLast, $maxDT); $num=cntRec($redis, $tblLast); #echo"Eseguito cleanUp: rimangono ".$num." valori in REDIS"; #echo "
"; } # mostro infine count record rimasti!!! $num=cntRec($redis, $tblLast); echo "
Fatto! ".$num." valori rimasti
"; echo "Elapsed time: ".StopWatch::elapsed()."
"; // 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 ?>