0

我在我的 Phalcon 应用程序中使用了两种不同的数据库服务。

  • db:具有系统范围数据的全局数据库,包括帐户和用户
  • db_data:此数据库托管客户特定的数据。每个客户/帐户的数据库名称都不同。这是在客户登录时确定的。

当我有一个帐户处于活动状态时,这适用于 Web 应用程序。现在我有一个 cronjob,它将遍历全局“db”数据库中的一个表。之后它将连接到特定的“db_data”数据库。

这适用于第一个帐户,但在此之后它将无法连接到新数据库。它仍然使用第一个启动的数据库。

db_data 服务是 services.php 中的共享服务:

$di->set('db_data', function () use ($config, $di) {
        if(!$di->getCore()->getAccount()) {
                throw new \MyNamespace\Exception(_('Account is not set. Can not load account database.'));
        }
        $eventsManager = $di->getShared('eventsManager');
        $dbListener = new \MyNamespace\Module\Core\Helper\Model\DatabaseListener();
        $eventsManager->attach('db_data', $dbListener);
    $connection = new \Phalcon\Db\Adapter\Pdo\Mysql(array(
        'host' => $config->database->host,
        'username' => $config->database->username,
        'password' => $config->database->password,
        'dbname' => $config->database->data_dbname_prefix.$di->getCore()->getAccount()->id,
        'name' => 'data',
    ));
        $connection->setEventsManager($eventsManager);
        return $connection;
}, true);

在“db”的第一个模型中,我在 initialize() 函数中有以下内容:

$this->setConnectionService('db');

在“db_data”的第二个模型中,我在 initialize() 函数中有以下内容:

$this->setConnectionService('db_data');

以下是 cron PHP 文件的示例:

$screens = \MyNamespace\Module\DigitalSignage\Model\Screen::find(array(
    'conditions' => 'deleted_at IS NULL',
));

foreach($screens as $screen) {
    $console->getDi()->getCore()->setAccount(\MyNamespace\Module\Core\Model\Account::findFirst('id='.$screen->account_id));
    $campaign = \MyNamespace\Module\DigitalSignage\Model\Campaign::findFirst(array(
            'conditions' => 'id = :id: AND account_id = :account_id: AND deleted_at IS NULL',
            'bind' => array(
                'id' => $screen->digitalsignage_campaign_id,
                'account_id' => $console->getDi()->getCore()->getAccount()->id,
            ),
        ));

    var_dump($campaign);
}

首次启动后更改数据库服务参数的正确方法是什么?

Phalcon 版本:3.2.2 PHP 版本:7.0.22

4

0 回答 0