【问题标题】:How to modify Matomo/Piwik database connections dynamically?如何动态修改 Matomo/Piwik 数据库连接?
【发布时间】:2016-11-11 17:21:41
【问题描述】:

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

但是,我正在努力弄清楚如何做到这一点。在我看来,有四种方法:

  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() 覆盖配置。

因此,引导设备或插件似乎都是一个好方法。我可以读取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\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 在第 40 行的 /var/www/html/core/Container/StaticContainer.php 中抛出

我也尝试了一个演示插件,我在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 包含该类时,会在 Web 应用程序中随机输出一些东西)。

这是我在配置中打开它:

PluginsInstalled[] = "DatabaseConfiguration"

One logged issue 关于这包括贡献者提供的通过私人咨询公司承担必要工作的提议。但是,我希望自己做必要的黑客攻击!

【问题讨论】:

    标签: php database-connection matomo


    【解决方案1】:

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

    特别是我在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 开发人员是否会让我将此功能添加到他们的插件列表中。

    【讨论】:

    • 谢谢,这真的很有帮助!要在最新版本的 Piwik(即 Matomo 3.5)中激活插件,您可以这样做:./console plugin:activate DatabaseConfiguration
    • 谢谢,这对在 Matomo 3.6 中运行非常有帮助。我还必须听 Event Tracker.getDatabaseConfig 因为显然 piwik.php 跟踪器使用不同的 API 来初始化数据库连接。另外,用./console generate:plugin --name="PlatformDatabaseConfiguration"开始插件开发,只是添加类会抱怨它与这个版本不兼容。
    • 啊,感谢@Berdir 的提醒 - 我还没有升级!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多