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

hal*_*fer 1 php database-connection matomo

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

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

  1. <?php echo getenv('PIWIK_DATABASE_USER') ?>语句放入config.ini.php配置文件中。然而,这会导致错误,我想知道这实际上是否只是一个 INI 文件,而不是一个 PHP 文件。似乎其他人也为此苦苦挣扎。
  2. 使用引导脚本重置全局常量PIWIK_USER_PATH以指向不同的配置/临时基础文件夹。我相当确定这会起作用,但这是我最不喜欢的解决方案,因为如果我想创建一个新环境或更改现有环境,我必须重建容器映像。
  3. 使用插件或引导系统捕获数据库凭据事件并在使用之前更改它们
  4. 使用插件或引导系统来覆盖配置Config::getInstance()->__set()

因此,引导设备或插件似乎都是一个不错的方法。我可以bootstrap.php读取 a ,但看起来它在引导过程的早期就被调用了,并且Config此时尚未填充单例。例如,如果我尝试在这里使用 (4),我只会收到错误。我正在使用这个演示代码:

<?php

require_once 'vendor/autoload.php';
\Piwik\Config::getInstance()->database['host'] ='localhost';
Run Code Online (Sandbox Code Playgroud)

这是错误:

PHP 致命错误:未捕获 Piwik\Container\ContainerDoesNotExistException:尚未创建根容器。在 /var/www/html/core/Container/StaticContainer.php:40\n堆栈跟踪:\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('Piwik\\Config')\n#2 /var/www/html/ bootstrap.php(4): Piwik\Config::getInstance()\n#3 /var/www/html/index.php(15): require_once('/var/www/html/b...')\ n#4 {main}\n 抛出在 /var/www/html/core/Container/StaticContainer.php 第 40 行

我也尝试过一个演示插件,并且在 中启用了它config.ini.php,但它似乎没有被包含或实例化,因此它的init()方法无法更改任何内容。这是插件代码:

<?php
// plugins/DatabaseConfiguration/DatabaseConfiguration.php             

namespace Piwik\Plugins\DatabaseConfiguration;

echo "Hello";

class DatabaseConfiguration extends \Piwik\Plugin
{
    protected function init()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

echo(请注意,当 Piwik 包含该类时,会在 Web 应用程序中临时输出一些随机内容)。

这是我在配置中打开它的情况:

PluginsInstalled[] = "DatabaseConfiguration"
Run Code Online (Sandbox Code Playgroud)

一个已记录的有关此问题的问题包括一位贡献者提出通过私人咨询开展必要的工作。然而,我希望自己能够进行必要的黑客攻击!

hal*_*fer 5

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

特别是我在以下内容中遗漏了这些行global.ini.php

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

[Plugins]
Plugins[] = DatabaseConfiguration
Run Code Online (Sandbox Code Playgroud)

即使还有另一个[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
Run Code Online (Sandbox Code Playgroud)

如果将其添加到 中就好了,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');
    }
}
Run Code Online (Sandbox Code Playgroud)

对于 Git 用户,可以在此处使用此插件。

当我有时间时,我会看看 Piwik 开发人员是否会让我将此功能添加到他们的插件列表中。