如何动态修改Matomo / Piwik数据库连接?

时间:2016-11-11 17:21:41

标签: php database-connection matomo

我在VPS上运行Piwik来记录我运行的Web应用程序的使用情况统计信息。我目前已将其部署为手动安装,并且最近开始着手Dockerising它的任务。根据十二个因子app原则,我想将其设置为动态读取数据库凭据,可能来自容器中的环境变量;这将允许我使用相同的图像,无论环境如何。

然而,我正在努力研究如何做到这一点。我认为有四种方法:

  1. <?php echo getenv('PIWIK_DATABASE_USER') ?>语句放入config.ini.php配置文件中。但是,这会导致错误,我想知道这实际上只是一个INI文件,而不是一个PHP文件。似乎other folksstruggled with this too
  2. 使用引导脚本将全局const PIWIK_USER_PATH重置为指向其他配置/临时基本文件夹。我很确定这会起作用,但这是我最不喜欢的解决方案,因为如果我想创建一个新环境或更改现有环境,我必须重建容器图像。
  3. 使用插件或引导系统捕获database credentials event并在使用前更改它们
  4. 使用插件或引导系统使用Config::getInstance()->__set()覆盖配置。
  5. 因此,似乎无论是引导设备还是插件都是一种很好的方法。我可以让bootstrap.php被读取,但看起来它在引导过程中很早就被调用了,并且Config单例在那时没有被填充。例如,如果我尝试在这里使用(4),我只是得到一个错误。我正在使用这个演示代码:

    <?php
    
    require_once 'vendor/autoload.php';
    \Piwik\Config::getInstance()->database['host'] ='localhost';
    

    这是错误:

      

    PHP致命错误:未捕获的Piwik \ Container \ ContainerDoesNotExistException:尚未创建根容器。在/var/www/html/core/Container/StaticContainer.php:40\nStack trace:\ n#0 /var/www/html/core/Container/StaticContainer.php(80):Piwik \ Container \ StaticContainer :: getContainer()\ n#1 /var/www/html/core/Config.php(64):Piwik \ Container \ StaticContainer :: get(&#39; Piwik \\ Config&#39;)\ n#2 / var /www/html/bootstrap.php(4):Piwik \ Config :: getInstance()\ n#3 /var/www/html/index.php(15):require_once(&#39; / var / www / html第40行的/var/www/html/core/Container/StaticContainer.php中抛出了/ b...' ;)\n#4 {main} \ n

    我也尝试了一个演示插件,我在config.ini.php中启用了它,但它似乎没有被包含或实例化,因此它的init()方法不适合改变一切。这是插件代码:

    <?php
    // plugins/DatabaseConfiguration/DatabaseConfiguration.php             
    
    namespace Piwik\Plugins\DatabaseConfiguration;
    
    echo "Hello";
    
    class DatabaseConfiguration extends \Piwik\Plugin
    {
        protected function init()
        {
        }
    }
    

    (注意临时echo在Piwik包含课程时在网络应用中随机输出内容。)

    这是我在配置中打开它:

    PluginsInstalled[] = "DatabaseConfiguration"
    

    One logged issue关于这一点包括捐助者通过私人咨询进行必要工作的提议。但是,我希望自己做必要的黑客攻击!

1 个答案:

答案 0 :(得分:4)

这个问题原来是个好橡皮鸭!这是我的解决方案。我使用了插件方法,只需要一些额外的配置。

特别是我在global.ini.php中错过了这些行:

; The below is appended to the global.ini.php config file

[Plugins]
Plugins[] = DatabaseConfiguration

即使有另一个[Plugins]部分,这似乎工作正常,所以我在Dockerfile中做了一个追加:

# Inject settings file here
COPY config/config.ini.php /var/www/html/config/config.ini.php
COPY config/global.ini.php.append /tmp/global.ini.php.append

# Append the global config to the existing file (this did not seem to be settable
# in the standard config file)
RUN cat /tmp/global.ini.php.append >> /var/www/html/config/global.ini.php

将它添加到config.inc.php会很不错,但它似乎对我不起作用。

最后,在plugins/DatabaseConfiguration/DatabaseConfiguration.php中安装了以下代码:

<?php

/**
 * A Piwik plugin to set database credentials based on environment variables
 */

namespace Piwik\Plugins\DatabaseConfiguration;

class DatabaseConfiguration extends \Piwik\Plugin
{
    public function registerEvents()
    {
        return [
            'Db.getDatabaseConfig' => 'getDatabaseConfig'
        ];
    }

    public function getDatabaseConfig(&$dbConfig)
    {
        $dbConfig['host'] = getenv('PIWIK_DATABASE_HOST');
        $dbConfig['dbname'] = getenv('PIWIK_DATABASE_NAME');
        $dbConfig['username'] = getenv('PIWIK_DATABASE_USER');
        $dbConfig['password'] = getenv('PIWIK_DATABASE_PASSWORD');
    }
}

对于Git用户,此插件为available here

当我得到片刻时,我会看看Piwik开发者是否允许我将此功能添加到他们的插件列表中。