diff --git a/README.md b/README.md index 74530e0..018a942 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,28 @@ Internet (RED) --|--> LB02.eqn --|--> GREEN --|--> FE02 --|--> DB in aggiunta - RED: server REDIS per persistenza "di breve durata" (redis01) +### LB01/02/03 + +### FE01/02/03 + +Sono macchine Ubuntu 14.04 LTS (andranno aggiornate a 18.04 LTS, saltiamo la 16.04) + +Per far funzionare Redis si è scelto un wrapper minimale che non ha dipendenze con le librerie installabili sulla 14.04: + +- https://github.com/ziogas/PHP-Redis-implementation +- copiato in locale ed inserito script... + +### Redis01 + +Installato server redis. poiché con ubuntu LST era vecchio (vers 3.0) abbiamo aggiornato a ultima release con ppa alternativi: + + + add-apt-repository ppa:chris-lea/redis-server + apt-get update + apt-get upgrade + +### DB + ## Comandi utili diff --git a/README.pdf b/README.pdf index b3a477a..4488328 100644 Binary files a/README.pdf and b/README.pdf differ diff --git a/appServer/redis.php b/appServer/redis.php new file mode 100644 index 0000000..89aa180 --- /dev/null +++ b/appServer/redis.php @@ -0,0 +1,323 @@ +connect($host, $port, $silent_fail, $timeout); + } + } + + //Main method to establish connection + public function connect($host = '127.0.0.1', $port = 6379, $silent_fail = false, $timeout = 60) + { + $this->host = $host; + $this->port = $port; + $this->silent_fail = $silent_fail; + $this->timeout = $timeout; + + if ($silent_fail) { + $this->handle = @fsockopen($host, $port, $errno, $errstr, $this->connect_timeout); + + if (!$this->handle) { + $this->handle = false; + } + } else { + $this->handle = fsockopen($host, $port, $errno, $errstr, $this->connect_timeout); + } + + if (is_resource($this->handle)) { + stream_set_timeout($this->handle, $this->timeout); + } + } + + public function reconnect() + { + $this->__destruct(); + $this->connect($this->host, $this->port, $this->silent_fail); + } + + public function __destruct() + { + if (is_resource($this->handle)) { + fclose($this->handle); + } + } + + //Returns all commands array + public function commands() + { + return $this->commands; + } + + //Used to push single command to queue + public function cmd() + { + if (!$this->handle) { + return $this; + } + + $args = func_get_args(); + $rlen = count($args); + + $output = '*'. $rlen . self::NL; + + foreach ($args as $arg) { + $output .= '$'. strlen($arg) . self::NL . $arg . self::NL; + } + + $this->commands[] = $output; + + return $this; + } + + //Used to push many commands at once, almost always for setting something + public function set() + { + if (!$this->handle) { + return false; + } + + //Total size of commands + $size = $this->exec(); + $response = array(); + + for ($i=0; $i<$size; $i++) { + $response[] = $this->get_response(); + } + + if ($this->force_reconnect) { + $this->reconnect(); + } + + return $response; + } + + //Used to get command response + public function get($line = false) + { + if (!$this->handle) { + return false; + } + + $return = false; + + if ($this->exec()) { + $return = $this->get_response(); + + if ($this->force_reconnect) { + $this->reconnect(); + } + } + + return $return; + } + + //Used to get length of the returned array. Most useful with `Keys` command + public function get_len() + { + if (!$this->handle) { + return false; + } + + $return = null; + + if ($this->exec()) { + $char = fgetc($this->handle); + + if ($char == self::BULK) { + $return = sizeof($this->bulk_response()); + } elseif ($char == self::MULTIBULK) { + $return = sizeof($this->multibulk_response()); + } + + if ($this->force_reconnect) { + $this->reconnect(); + } + } + + return $return; + } + + //Forces to reconnect after every get() or set(). Use this with extreme caution + public function set_force_reconnect($flag) + { + $this->force_reconnect = $flag; + return $this; + } + + //Used to parse single command single response + private function get_response() + { + $return = false; + + $char = fgetc($this->handle); + + switch ($char) { + case self::INLINE: + $return = $this->inline_response(); + break; + case self::INTEGER: + $return = $this->integer_response(); + break; + case self::BULK: + $return = $this->bulk_response(); + break; + case self::MULTIBULK: + $return = $this->multibulk_response(); + break; + case self::ERROR: + $return = $this->error_response(); + break; + } + + return $return; + } + + //For inline responses only + private function inline_response() + { + return trim(fgets($this->handle)); + } + + //For integer responses only + private function integer_response() + { + return ( int ) trim(fgets($this->handle)); + } + + //For error responses only + private function error_response() + { + $error = fgets($this->handle); + + if ($this->error_function) { + call_user_func($this->error_function, $error .'('. $this->last_used_command .')'); + } + + return false; + } + + //For bulk responses only + private function bulk_response() + { + $return = trim(fgets($this->handle)); + + if ($return === '-1') { + $return = null; + } else { + $return = $this->read_bulk_response($return); + } + + return $return; + } + + //For multibulk responses only + private function multibulk_response() + { + $size = trim(fgets($this->handle)); + $return = false; + + if ($size === '-1') { + $return = null; + } else { + $return = array(); + + for ($i = 0; $i < $size; $i++) { + $return[] = $this->get_response(); + } + } + + return $return; + } + + //Sends command to the redis + private function exec() + { + $size = sizeof($this->commands); + + if ($size < 1) { + return null; + } + + if ($this->error_function) { + $this->last_used_command = str_replace(self::NL, '\\r\\n', implode(';', $this->commands)); + } + + $command = implode(self::NL, $this->commands) . self::NL; + fwrite($this->handle, $command); + + $this->commands = array(); + return $size; + } + + //Bulk response reader + private function read_bulk_response($tmp) + { + $response = null; + + $read = 0; + $size = ((strlen($tmp) > 1 && substr($tmp, 0, 1) === self::BULK) ? substr($tmp, 1) : $tmp); + + while ($read < $size) { + $diff = $size - $read; + + $block_size = $diff > 8192 ? 8192 : $diff; + + $chunk = fread($this->handle, $block_size); + + if ($chunk !== false) { + $chunkLen = strlen($chunk); + $read += $chunkLen; + $response .= $chunk; + } else { + fseek($this->handle, $read); + } + } + + fgets($this->handle); + + return $response; + } + + public function set_error_function($func) + { + $this->error_function = $func; + } +} diff --git a/appServer/test_redis.php b/appServer/test_redis.php index b504542..aae6905 100644 --- a/appServer/test_redis.php +++ b/appServer/test_redis.php @@ -1,28 +1,19 @@

EQN

Testing procedure Redis per EQN... "tcp", - #"host" => "172.16.1.80", - "host" => "redis01", - "port" => 6379 - )); +require 'redis.php'; + +function redis_error($error) { + throw new error($error); } -catch (Exception $e) { - die($e->getMessage()); -} -?> -Server inizializzato, proseguono test -
-connect("redis01"); +$redis->set_error_function('redis_error'); + +echo "Server inizializzato, proseguono test
"; + #------------------------------------------------------ # VALORI DI CONFIGURAZIONE (portare su file ext!!!) #------------------------------------------------------ @@ -39,12 +30,12 @@ $nBlockRec = 10; # definizione funzioni helper x gestione REDIS dell'oggetto (UserID = numero, DTime in intero fino ai minuti yyMMddHHmm) function salvaPosizione($redis, $tblPos, $tblLast, $User_ID, $Lat, $Lon, $DTime) { # salvo dataora verifica - $redis->zadd( $tblLast, $DTime, $User_ID ); + $redis->cmd('ZADD', $tblLast, $DTime, $User_ID ) // # salvo posizione Geolocalizzata - // $redis->geoadd( $tblPos, $Lat, $Lon, $User_ID ) + ->cmd('GEOADD',$tblPos, $Lat, $Lon, $User_ID ) + ->set(); } -# $predis->zadd( 'myset', [ "one" => 1, "uno" => 1, "two" => 2, "three" => 3 ] ) @@ -68,59 +59,4 @@ salvaPosizione($redis, $tblPos, $tblLast, $uID, $cLat, $cLon, $currDT); -// $server = gethostname(); -// $adesso = date("F j, Y \a\t g:ia"); -// $redis->set($server,$adesso); -// $redis->incr($server."_count"); - -// $redis->hset("taxi_car", "brand", "Toyota"); -// $redis->hset("taxi_car", "model", "Yaris"); -// $redis->hset("taxi_car", "license number", "RO-01-PHP"); -// $redis->hset("taxi_car", "year of fabrication", 2010); -// $redis->hset("taxi_car", "nr_starts", 0); - -// $valore = $redis->get($server); - -// echo ($redis->exists($server)) ? "Valore salvato: ".$valore : "Prego salvare valore..."; - -// $taxi_car = $redis->hgetall("taxi_car"); -// echo "
"; -// echo "All info about taxi car"; -// echo "
";
-// var_dump($taxi_car);
-// echo "
"; - -// echo "
"; -// $list = "PHP Frameworks List"; -// $redis->rpush($list, "Symfony 2"); -// $redis->rpush($list, "Symfony 1.4"); -// $redis->lpush($list, "Zend Framework"); - -// echo "Number of frameworks in list: " . $redis->llen($list) . "
"; - -// $arList = $redis->lrange($list, 0, -1); -// echo "
";
-// print_r($arList);
-// echo "
"; - -// // the last entry in the list -// echo $redis->rpop($list) . "
"; - -// // the first entry in the list -// echo $redis->lpop($list) . "
"; - -// echo "
"; -// // set the expiration for next week -// $redis->set("expire in 1 week", "I have data for a week"); -// $redis->expireat("expire in 1 week", strtotime("+1 week")); -// $ttl = $redis->ttl("expire in 1 week"); // will be 604800 seconds - -// // set the expiration for one hour -// $redis->set("expire in 1 hour", "I have data for an hour"); -// $redis->expire("expire in 1 hour", 3600); -// $ttl = $redis->ttl("expire in 1 hour"); // will be 3600 seconds - -// // never expires -// $redis->set("never expire", "I want to leave forever!"); - ?>