【发布时间】:2016-11-11 17:21:41
【问题描述】:
我在 VPS 上运行 Piwik 来记录我运行的 Web 应用程序的使用统计信息。我目前已将其部署为手动安装,并且最近开始着手 Dockerising 的任务。根据十二因素应用程序原则,我想将其设置为动态读取数据库凭据,可能来自容器中的环境变量;这将允许我在任何环境下都使用相同的图像。
但是,我正在努力弄清楚如何做到这一点。在我看来,有四种方法:
- 将
<?php echo getenv('PIWIK_DATABASE_USER') ?>语句放入config.ini.php配置文件中。但是,这会导致错误,我想知道这实际上是否只是一个 INI 文件而不是 PHP 文件。看来other folks 有struggled with this too。 - 使用引导脚本重置全局 const
PIWIK_USER_PATH以指向不同的配置/临时基础文件夹。我相当肯定这会起作用,但这是我最不喜欢的解决方案,因为如果我想创建一个新环境或更改现有环境,我必须重建容器映像。 - 使用插件或引导系统捕获database credentials event 并在使用前对其进行更改
- 使用插件或引导系统使用
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