我在我的 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