Error in update emoncms

The feed data is held in this location emoncms_datadir=/var/opt/emoncms as set by the config.ini

The SQL database is used for user data, dashboard configuration, process configuration etc.

when inserting the local emoncms url presents these php files, what can I do to solve them?

? php
/ *

Todo o código Emoncms é liberado sob a Licença Pública Geral GNU Affero.
Consulte COPYRIGHT.txt e LICENSE.txt.

-------------------------------------------------- -------------------
Emoncms - visualização de energia de código aberto
Parte do projeto OpenEnergyMonitor:
http://openenergymonitor.org

* /

define ('EMONCMS_EXEC', 1);

// 1) Carregar configurações e scripts principais
requer "process_settings.php";
requer "core.php";
requer "route.php";
requer "param.php";
requer "locale.php";

$ emoncms_version = ($ feed_settings ['redisbuffer'] ['ativado']? "gravação baixa": ""). versão();

$ caminho = get_application_path ();
$ sidebarFixed = true;

requer "Lib / EmonLogger.php";
$ log = novo EmonLogger (__ FILE__);
if (isset ($ _ GET ['q'])) $ log-> informações ($ _ GET ['q']);

// 2) Banco de dados
if ($ redis_enabled) {
    $ redis = novo Redis ();
    $ conectado = $ redis-> conectar ($ redis_server ['host'], $ redis_server ['porta']);
    if (! $ connected) {echo "Não é possível conectar-se ao redis em". $ redis_server ['host']. ":". $ redis_server ['port']. ", pode ser que o redis-server não esteja instalado ou iniciado, consulte o leia-me para a instalação do redis "; morrer; }
    if (! vazio ($ redis_server ['prefixo'])) $ redis-> setOption (Redis :: OPT_PREFIX, $ redis_server ['prefixo']);
    if (! vazio ($ redis_server ['auth']))) {
        if (! $ redis-> auth ($ redis_server ['auth']))) {
            echo "Não é possível conectar-se ao redis em". $ redis_server ['host']. ", a autenticação falhou"; morrer;
        }
    }
    if (! empty ($ redis_server ['dbnum']))) {
        $ redis-> select ($ redis_server ['dbnum']);
    }
} outro {
    $ redis = false;
}

$ mqtt = false;

# Verifique se os módulos PHP do MySQL estão carregados
if (! extension_loaded ('mysql') &&! extension_loaded ('mysqli')) {
   echo "Parece que sua instalação do PHP não possui as extensões do MySQL exigidas pelo Emoncms. <br> Consulte /php-info.php (restrito ao acesso local)"; morrer;
}

# Verifique o módulo PHP do Gettext carregado
if (! extension_loaded ('gettext')) {
   echo "Sua instalação do PHP parece não ter a extensão gettext exigida pelo Emoncms. <br> Consulte /php-info.php (restrito ao acesso local)"; morrer;
}

$ mysqli = @ novo mysqli ($ servidor, $ nome de usuário, $ senha, $ banco de dados, $ porta);
if ($ mysqli-> connect_error) {
    echo "Não foi possível conectar ao banco de dados, verifique as credenciais / configurações em settings.php <br />";
    if ($ display_errors) {
        eco "Mensagem de erro: <b>". $ mysqli-> connect_error. "</b>";
    }
    morrer();
}
// Defina charset como utf8
$ mysqli-> set_charset ("utf8");

if (! $ mysqli-> connect_error && $ dbtest == true) {
    requer "Lib / dbschemasetup.php";
    if (! db_check ($ mysqli, $ database)) db_schema_setup ($ mysqli, load_db_schema (), true);
}

// 3) Sessões do usuário
require ("Módulos / usuário / usuário_model.php");
$ usuário = novo usuário ($ mysqli, $ redis);

$ apikey = false;
$ devicekey = false;
if (isset ($ _ GET ['apikey'])) {
    $ apikey = $ _GET ['apikey'];
} else if (isset ($ _ POST ['apikey']))) {
    $ apikey = $ _POST ['apikey'];
} else if (isset ($ _ GET ['devicekey']))) {
    $ devicekey = $ _GET ['devicekey'];
} else if (isset ($ _ POST ['devicekey']))) {
    $ devicekey = $ _POST ['devicekey'];
} else if (isset ($ _ SERVER ["HTTP_AUTHORIZATION"])) {
    // Suporta a passagem de apikey no cabeçalho de autorização por rfc6750, como exemplo:
    // GET / recurso HTTP / 1.1
    // Host: server.example.com
    // Autorização: portador THE_API_KEY_HERE
    
    if (isset ($ _ SERVER ["CONTENT_TYPE"]) && $ _SERVER ["CONTENT_TYPE"] == "aes128cbc") {
        // Se content_type for AES128CBC
    } outro {
        $ apikey = str_replace ('Portador', '', $ _SERVER ["HTTP_AUTHORIZATION"]);
    }
}

$ dispositivo = falso;
if ($ apikey) {
    $ session = $ user-> apikey_session ($ apikey);
    if (vazio ($ session)) {
          cabeçalho ($ _ SERVER ["SERVER_PROTOCOL"]. "401 Não autorizado");
          cabeçalho ('WWW-Authenticate: domínio do portador = "API KEY", erro = "invalid_apikey", error_description = "Chave de API inválida"');
          print "Chave API inválida";
          $ log-> error ("Chave de API inválida '". $ apikey. "' |". $ _ SERVER ["REMOTE_ADDR"]);
          Saída();
    }
} senão se ($ devicekey && (@include "Módulos / dispositivo / device_model.php")) {
    $ dispositivo = novo dispositivo ($ mysqli, $ redis);
    $ session = $ device-> devicekey_session ($ devicekey);
    if (vazio ($ session)) {
          cabeçalho ($ _ SERVER ["SERVER_PROTOCOL"]. "401 Não autorizado");
          cabeçalho ('WWW-Authenticate: domínio do portador = "Device KEY", erro = "invalid_devicekey", error_description = "Chave de dispositivo inválida"');
          imprimir "Chave de dispositivo inválida";
          $ log-> error ("Chave de dispositivo inválida '". $ devicekey. "'");
          Saída();
    }
} outro {
    $ session = $ user-> emon_session_start ();
}

// 4) Idioma
if (! isset ($ session ['lang'])) $ session ['lang'] = '';
set_emoncms_lang ($ session ['lang']);

// 5) Obter controlador de rota e carregamento

// string de saída se o controlador ou a ação não for encontrada. usado para retornar erro.
define ('EMPTY_ROUTE', "# NÃO DEFINIDO #");

$ rota = nova rota (get ('q')), servidor ('DOCUMENT_ROOT'), servidor ('REQUEST_METHOD'));

// Carrega parâmetros get / post / encrypted - usados ​​apenas pelas APIs input / post e input / bulk
$ param = new Param ($ rota, $ usuário);

// ------------------------------------------------ --------------------------------------
// Rotas especiais

// Retorna um breve descritor de dispositivo para detecção de hub
if ($ route-> controller == "descreva") { 
    cabeçalho ('Tipo de conteúdo: texto / sem formatação');
    cabeçalho ('Access-Control-Allow-Origin: *');
    if (file_exists ('/ home / pi / data / emonbase')) {
        $ type = 'emonbase';
    } elseif (arquivo_existe ('/ home / pi / data / emonpi')) {
        $ type = 'emonpi';
    } outro {
        $ type = 'emoncms';
    }
    eco $ type;
    morrer;
}
// lê o arquivo da versão e retorna o valor;
if ($ route-> controller == "version") { 
    cabeçalho ('Tipo de conteúdo: texto / sem formatação; charset = utf-8'); 
    versão eco ();
    Saída; 
}

if (get ('embed') == 1) $ embed = 1; else $ embed = 0;

// Se nenhuma rota especificada usar padrões
if ($ route-> isRouteNotDefined ())
{
    // Assistente de instalação do EmonPi
    if ($ allow_emonpi_admin) {
        if (file_exists ("Modules / setup")) {
            requer "Módulos / setup / setup_model.php";
            $ setup = nova instalação ($ mysqli);
            if ($ setup-> status () == "não configurado") {
                $ default_controller = "configuração";
                $ default_action = "";
                // Fornece acesso de configuração especial às funções do módulo WIFI
                $ _SESSION ['setup_access'] = verdadeiro;
            }
        }
    }
    
    if (! isset ($ session ['read']) || (isset ($ session ['read']) &&! $ session ['read'])) {
        // Padrões não autenticados
        $ route-> controller = $ default_controller;
        $ route-> action = $ default_action;
        $ route-> subaction = "";
    } outro {
        if (isset ($ sessão ["página inicial"]) && $ session ["página inicial"]! = "") {
            cabeçalho ('Localização:'. $ session ["página inicial"]);
            morrer;
        } outro {
            // Padrões autenticados
            $ route-> controller = $ default_controller_auth;
            $ route-> action = $ default_action_auth;
            $ route-> subaction = "";
        }
    }
}

if ($ devicekey &&! ($ route-> controller == 'input' && ($ route-> action == 'bulk' || $ route-> action == 'post'))) {
    cabeçalho ($ _ SERVER ["SERVER_PROTOCOL"]. "401 Não autorizado");
    print "Não autorizado. A autenticação da chave do dispositivo permite apenas ações de entrada ou em massa";
    $ log-> error ("Não autorizado. A autenticação da chave do dispositivo permite apenas ações de entrada ou em massa");
    Saída();
}

if ($ route-> controller == 'input' && $ route-> action == 'bulk') $ route-> format = 'json';
caso contrário, se ($ route-> controller == 'input' && $ route-> action == 'post') $ route-> format = 'json';

// 6) Carrega o controlador da página principal
$ output = controller ($ route-> controller);
// Se não houver um controlador com esse nome - tente username
// realmente precisa testar se não há um controlador e não se não houver conteúdo
// é retornado do controlador.
if ($ output ['content'] == EMPTY_ROUTE && $ public_profile_enabled && $ route-> controller! = 'admin')
{
    $ userid = $ user-> get_id ($ rota-> controlador);
    if ($ userid) {
        $ rota-> subação = $ rota-> ação;
        $ session ['userid'] = $ ID do usuário;
        $ session ['nome de usuário'] = $ route-> controller;
        $ session ['read'] = 1;
        $ session ['profile'] = 1;
        $ route-> controller = $ public_profile_controller;
        $ route-> action = $ public_profile_action;
        $ output = controller ($ route-> controller);

        // captura "nome de usuário / gráfico" e redireciona para o módulo de gráficos se não existir nenhum painel chamado "gráfico"
        if ($ output ["content"] == "" && $ route-> subaction == "graph") {
            $ route-> controller = "gráfico";
            $ route-> action = "";
            $ _GET ['ID do usuário'] = $ ID do usuário;
            $ output = controller ($ route-> controller);
        }
    }
}

// Se nenhum controlador encontrado ou nada for retornado, dê um erro amigável
if ($ output ['content'] === EMPTY_ROUTE) {
    // alterar saída é $ route has $ action
    $ actions = implode ("/", array_filter (array ($ rota-> ação, $ rota-> subação)));
    $ message = sprintf (_ ('% s não pode responder a% s'), sprintf ("<strong>% s </strong>", ucfirst ($ route-> controller)), sprintf ('<strong> "% s "</strong> ', $ actions));
    // altera o código do cabeçalho http
    cabeçalho ($ _ SERVER ["SERVER_PROTOCOL"]. "406 Não aceitável");
    $ title = _ ('406 Não Aceitável');
    $ plain_text = _ ('Rota não encontrada');
    $ intro = sprintf ('% s% s', _ ('URI não é aceitável.'), $ message);
    $ text = _ ('Tente outro link no menu.');
    // retorna a string formatada
    if ($ route-> format === 'html') {
        $ output ['content'] = sprintf ('<h2>% s </h2> <p class = "lead">% s. </p> <p>% s </p>', $ title, $ introdução, $ text);
    } outro {
        $ output ['content'] = matriz (
            'success' => false,
            'message' => sprintf ('% s.% s', $ title, $ plain_text)
        );
    }
    $ log-> warn (sprintf ('% s |% s', $ title, implode ('/', array_filter (array ($ rota-> controlador, $ rota-> ação, $ rota-> subação)))) );
}

// Se não estiver autenticado e sem saída, solicita o login
if ($ output ['content'] == "" && (! isset ($ session ['read']) || (isset ($ session ['read']) &&! $ session ['read'])) ) {
    $ log-> error (sprintf ('% s |% s', _ ('Not Authenticated'), implode ('/', array_filter (array ($ route-> controller, $ route-> action, $ route-> subação)))));
    $ route-> controller = "usuário";
    $ route-> action = "login";
    $ route-> subaction = "";
    $ message = urlencode (_ ('Autenticação necessária'));
    $ referrer = urlencode (base64_encode (filter_var ($ _ SERVER ['REQUEST_URI']], FILTER_SANITIZE_URL)));
    $ rota-> consulta = sprintf ("msg =% s & ref =% s", $ mensagem, $ referenciador);
    $ output = controller ($ route-> controller);
}

$ output ['rota'] = $ rota;
$ output ['session'] = $ sessão;

// 7) Saída
if ($ route-> format == 'json')
{
    if ($ route-> controller == 'time') {
        cabeçalho ('Tipo de conteúdo: texto / sem formatação');
        imprime $ output ['content'];
    } elseif ($ route-> controller == 'input' e& $ route-> action == 'post') {
        cabeçalho ('Tipo de conteúdo: texto / sem formatação');
        imprime $ output ['content'];
    } elseif ($ route-> controller == 'input' e& $ route-> action == 'bulk') {
        cabeçalho ('Tipo de conteúdo: texto / sem formatação');
        imprime $ output ['content'];
    } outro {
        cabeçalho ('Content-Type: application / json');
        if (! vazio ($ output ['message'])) {
            cabeçalho (sprintf ('X-emoncms-message:% s', $ output ['message']));
        }
        print json_encode ($ output ['content']);
        if (json_last_error ()! = JSON_ERROR_NONE) {
            switch (json_last_error ()) {
                caso JSON_ERROR_DEPTH:
                    $ log-> error ("json_encode - $ route-> controller: profundidade máxima da pilha excedida");
                    quebrar;
                caso JSON_ERROR_STATE_MISMATCH:
                    $ log-> error ("json_encode - $ route-> controller: Underflow ou incompatibilidade de modos");
                    quebrar;
                caso JSON_ERROR_CTRL_CHAR:
                    $ log-> error ("json_encode - $ route-> controller: caractere de controle inesperado encontrado");
                    quebrar;
                caso JSON_ERROR_SYNTAX:
                    $ log-> error ("json_encode - $ route-> controller: erro de sintaxe, JSON malformado");
                    quebrar;
                caso JSON_ERROR_UTF8:
                    $ log-> error ("json_encode - $ route-> controller: caracteres UTF-8 malformados, possivelmente codificados incorretamente");
                    quebrar;
                padrão:
                    $ log-> error ("json_encode - $ route-> controller: erro desconhecido");
                    quebrar;
            }
        }
    }
}
caso contrário, se ($ route-> format == 'html')
{
    // Selecione o tema
    $ themeDir = "Tema /". $ theme. "/";
    if ($ embed == 1) {
        visualização de impressão ($ themeDir. "embed.php", $ output);
    } outro {
        $ menu = menu_de_carga ();
        
        // MENU EMONCMS
        if ($ session ['write']) {
            $ menu ['tabs'] [] = matriz (
                'ícone' => 'menu',
                'title' => _ ("Emoncms"),
                'text' => _ ("Configuração"),
                'caminho' => 'feed / lista',
                'order' => 0,
                'data' => matriz (
                    'sidebar' => '#sidebar_emoncms'
                )
            );
        }

        include_once ("Lib / misc / nav_functions.php");
        sortMenu ($ menu);
        // debugMenu ('barra lateral');
        $ output ['svg_icons'] = view ($ themeDir. "svg_icons.svg", array ());
        $ output ['mainmenu'] = view ($ themeDir. "menu_view.php", array ('menu' => $ menu));
        
        // adiciona nomes de classe css à tag <body> com base nas opções do controlador
        $ output ['page_classes'] [] = $ route-> controlador;

        $ output ['sidebar'] = view ($ themeDir. "sidebar_view.php", 
        matriz (
            'menu' => $ menu,
            'caminho' => $ caminho,
            'session' => $ session,
            'route' => $ route
        ));
        $ output ['page_classes'] [] = 'barra lateral';
        if (! $ session ['read']) {
            $ output ['page_classes'] [] = 'manual recolhido';
        } outro {
            if (! in_array ("manual", $ output ['page_classes'])) $ output ['page_classes'] [] = 'auto';
        }
        visualização de impressão ($ themeDir. "theme.php", $ output);
    }
}
caso contrário, se ($ route-> format == 'text')
{
    cabeçalho ('Tipo de conteúdo: texto / sem formatação');
    imprime $ output ['content'];
}

caso contrário, se ($ route-> format == 'csv')
{
    cabeçalho ('Content-Type: text / csv');
    imprime $ output ['content'];
}
outro {
    cabeçalho ($ _ SERVER ["SERVER_PROTOCOL"]. "406 Não aceitável");
    print "URI não aceitável. Formato desconhecido '". $ route-> format. "'.";
}

I’m sorry, I don’t know what has happened.

Tell me exactly what commands you executed.

Did you get any errors during the install?

I have made a short video of what I did to install the system on a bare Ubuntu18LTS server.

A little different from your documentation.

Don’t think so.

I will follow the installation steps according to the video.
Thank you !

The commands used are in the comments section, taken from the .bash_history.

the commands run normal and when I enter emoncms it shows this error

settings.php file error

redis enabled but not installed, check setting: redis_enabled

To fix, check that the settings are set in settings.php or try re-creating your settings.php file from default.settings.php template

Did you get any errors when running the install script?

Couple of things to check

systemctl status redis.service
sudo apt-get install -y redis-server

I executed both commands and presented this information below:

emoncms@emoncms:/var/www/emoncms$ sudo nano settings.php
emoncms@emoncms:/var/www/emoncms$ systemctl status redis.service
● redis-server.service - Advanced key-value store
   Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-09-13 16:10:17 -03; 12min ago
     Docs: http://redis.io/documentation,
           man:redis-server(1)
 Main PID: 26344 (redis-server)
    Tasks: 4 (limit: 2305)
   CGroup: /system.slice/redis-server.service
           └─26344 /usr/bin/redis-server 127.0.0.1:6379

Sep 13 16:10:17 emoncms systemd[1]: Stopped Advanced key-value store.
Sep 13 16:10:17 emoncms systemd[1]: Starting Advanced key-value store...
Sep 13 16:10:17 emoncms systemd[1]: redis-server.service: Can't open PID file /var/run/redis/redis-server.pid (yet?) after start: No such file or directory
Sep 13 16:10:17 emoncms systemd[1]: Started Advanced key-value store.
emoncms@emoncms:/var/www/emoncms$ sudo apt-get install -y redis-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
redis-server is already the newest version (5:4.0.9-1ubuntu0.2).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
emoncms@emoncms:/var/www/emoncms$

Ok good so redis-server is running.

Check this file…

cat /etc/php/7.2/mods-available/redis.ini

and

sudo pip install redis

Here is the output:

extension=redis.so
Requirement already satisfied: redis in /usr/local/lib/python2.7/dist-packages (3.3.8)

Have you rebooted?

Yes, apresenta o mesmo erro.

Some things to try;

Check the php-info

 php -i | grep -i redis

From Installing emoncms - redis problem on openSUSE system - #27 by pb66 - the small script below will prove if PHP is able to connect to Redis on a basic level.

<?php
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    if ($redis->ping() === "+PONG") {
        echo "Successfully connected to Redis!".PHP_EOL;
    } else {
        echo "Failed to get response from Redis!".PHP_EOL;
    }
?>

Save the above code to a file called test_redis.php and run from the command line

pb66@test2:~$ php test_redis.php
Successfully connected to Redis!

Final thing to check (if the above were unsuccessful) - from Installing emoncms - redis problem on openSUSE system - #4 by Greebo - test redis from the command line… Try this:

$ redis-cli
127.0.0.1:6379> lpush test "hello"
(integer) 1
127.0.0.1:6379> lpop test
"hello"
127.0.0.1:6379> exit
$

If that all works, we can confirm that redis is actually working and rule that out.

This is an odd one as it just worked for me.

Can you both post your latest “server info” for comparison?

Server Information

Server Information

Services

  • emoncms_mqtt :- Active Running
  • feedwriter :- Active Running - sleep 60s 0 feed points pending write
  • service-runner :- Active Running
  • redis-server :- Active Running
  • mosquitto :- Active Running

Emoncms

Server

  • OS :- Linux 4.15.0-62-generic
  • Host :- ubunt-emon | ubunt-emon | (192.168.7.77)
  • Date :- 2019-09-14 12:47:03 UTC
  • Uptime :- 12:47:03 up 1 day, 16:39, 2 users, load average: 0.07, 0.02, 0.00

Memory

  • RAM :- Used: 39.63%
    • Total :- 986.08 MB
    • Used :- 390.82 MB
    • Free :- 595.26 MB
  • Swap :- Used: 0.88%
    • Total :- 1.92 GB
    • Used :- 17.34 MB
    • Free :- 1.91 GB

Disk

  • / :- Used: 28.85%
    • Total :- 15.68 GB
    • Used :- 4.52 GB
    • Free :- 10.34 GB

HTTP

  • Server :- Apache/2.4.29 (Ubuntu) HTTP/1.1 CGI/1.1 80

MySQL

  • Version :- 5.5.5-10.1.41-MariaDB-0ubuntu0.18.04.1
  • Host :- localhost:6379 (127.0.0.1)
  • Date :- 2019-09-14 12:47:03 (UTC 00:00‌​)
  • Stats :- Uptime: 99863 Threads: 2 Questions: 403679 Slow queries: 0 Opens: 178 Flush tables: 1 Open tables: 41 Queries per second avg: 4.042

Redis

  • Version :- 4.0.9
  • Host :- localhost:6379
  • Size :- 168 keys (966.30K)
  • Uptime :- 0 days

MQTT Server

  • Version :- Mosquitto 1.4.15
  • Host :- 192.168.7.50:1883 (192.168.7.50)

PHP

  • Version :- 7.2.19-0ubuntu0.18.04.2 (Zend Version 3.2.0)
  • Modules :- apache2handler | calendar v7.2.19-0ubuntu0.18.04.2 | Core v7.2.19-0ubuntu0.18.04.2 | ctype v7.2.19-0ubuntu0.18.04.2 | curl v7.2.19-0ubuntu0.18.04.2 | date v7.2.19-0ubuntu0.18.04.2 | dom v20031129 | exif v7.2.19-0ubuntu0.18.04.2 | fileinfo v1.0.5 | filter v7.2.19-0ubuntu0.18.04.2 | ftp v7.2.19-0ubuntu0.18.04.2 | gd v7.2.19-0ubuntu0.18.04.2 | gettext v7.2.19-0ubuntu0.18.04.2 | hash v1.0 | iconv v7.2.19-0ubuntu0.18.04.2 | json v1.6.0 | libxml v7.2.19-0ubuntu0.18.04.2 | mbstring v7.2.19-0ubuntu0.18.04.2 | mosquitto v0.4.0 | mysqli v7.2.19-0ubuntu0.18.04.2 | mysqlnd vmysqlnd 5.0.12-dev - 20150407 - $Id: 3591daad22de08524295e1bd073aceeff11e6579 $ | openssl v7.2.19-0ubuntu0.18.04.2 | pcre v7.2.19-0ubuntu0.18.04.2 | PDO v7.2.19-0ubuntu0.18.04.2 | pdo_mysql v7.2.19-0ubuntu0.18.04.2 | Phar v2.0.2 | posix v7.2.19-0ubuntu0.18.04.2 | readline v7.2.19-0ubuntu0.18.04.2 | redis v5.0.2 | Reflection v7.2.19-0ubuntu0.18.04.2 | session v7.2.19-0ubuntu0.18.04.2 | shmop v7.2.19-0ubuntu0.18.04.2 | SimpleXML v7.2.19-0ubuntu0.18.04.2 | sockets v7.2.19-0ubuntu0.18.04.2 | sodium v7.2.19-0ubuntu0.18.04.2 | SPL v7.2.19-0ubuntu0.18.04.2 | standard v7.2.19-0ubuntu0.18.04.2 | sysvmsg v7.2.19-0ubuntu0.18.04.2 | sysvsem v7.2.19-0ubuntu0.18.04.2 | sysvshm v7.2.19-0ubuntu0.18.04.2 | tokenizer v7.2.19-0ubuntu0.18.04.2 | wddx v7.2.19-0ubuntu0.18.04.2 | xml v7.2.19-0ubuntu0.18.04.2 | xmlreader v7.2.19-0ubuntu0.18.04.2 | xmlwriter v7.2.19-0ubuntu0.18.04.2 | xsl v7.2.19-0ubuntu0.18.04.2 | Zend OPcache v7.2.19-0ubuntu0.18.04.2 | zlib v7.2.19-0ubuntu0.18.04.2
Client Information

Client Information

HTTP

  • Browser :- Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
  • Language :- en-GB,en-US;q=0.9,en;q=0.8

Window

  • Size :- 1605 x 840

Screen

  • Resolution :- 1920 x 1080
brian@ubunt-emon:/var/www/emoncms$ sudo pip show redis | grep Version
Version: 3.3.8

which file path?

You can save it to where you wish - you created the file (see post no.56).