1

特定の Web サイトをスキャン/クロール/監視するアプリを開発しています

アプリは無料で入手できますwww.linkbook.co

今、私がやりたいことを説明します:

ウェブサイト、ウェブサイトで見つかった URL、および各ウェブサイトの URL パターンを格納するメイン DB があります。Web サイトは、彼が割り当てられている Db を認識しており、URL は Web サイト ID を認識しています。

2 GB/DB の制限があるため、セカンダリ DB が必要です。

http://www.yiiframework.com/wiki/123/multiple-database-support-in-yii/と Google が見つけたものをすべて読みましたが、接続を動的に使用した完全な例は 1 つもありません。

したがって、アプリが Web サイトをスキャンするたびに、見つかった各 URL がメイン DB に挿入され、URL が属する Web サイトに割り当てられている DB にも挿入されます。

やがて、メイン DB のデータは削除されますが、セカンダリ DB では引き続き使用できます。

したがって、HOT 情報のみがメインに保存されますが、セカンダリ データベースには保存されたままになります。

Yii の連中はこの例を挙げていますが、適切な DB に切り替えるには、1 から N、N=1-> 無限のパラメーターが必要です。

class MyActiveRecord extends CActiveRecord {
    ...
    private static $dbadvert = null;

    protected static function getAdvertDbConnection()
    {
        if (self::$dbadvert !== null)
            return self::$dbadvert;
        else
        {
            self::$dbadvert = Yii::app()->dbadvert;
            if (self::$dbadvert instanceof CDbConnection)
            {
                self::$dbadvert->setActive(true);
                return self::$dbadvert;
            }
            else
                throw new CDbException(Yii::t('yii','Active Record requires a "db" CDbConnection application component.'));
        }
    }
    ...

$dbadvert は動的である必要があります。これは私の問題です。

また、セカンダリ DB のテーブルはまったく同じではありません。すべてのテーブルのすべてのフィールドは必要なく、一部のテーブルも削除されるため、モデルが必要です。

モデルは私が書くことができます。難しいことではありません。いくつかのフィールドを削除するだけです。

これは私が今持っているもので、特定のDB、db1、別名linkbookco1に挿入するだけです

$command = Yii::app()->db1->createCommand("INSERT INTO `url` (
`id` ,
`website_id` ,
`link` ,
`name` ,
`created` ,
`instance_scanner_id` ,
`status`
)
VALUES (
NULL ,  '".($model_url->website_id)."',  '".($model_url->link)."',  '".($model_url->name)."',  '".($model_url->created)."',  '".($model_url->instance_scanner_id)."',  '".($model_url->status)."'
);
");
$command->query();

yii 開発者が言うように、db1 とそのパラメーターは構成ファイルに記載されています。

4

1 に答える 1

1

あなたの例から、私はあなたがあなたのアプリで次のようなセカンダリデータベース接続を構成していると推測できます

'dbadvert' => array(
    'class' => 'CDbConnection',
    ...
)

データベース接続を取得する必要があるポイントは次のとおりです。

self::$dbadvert = Yii::app()->dbadvert;

したがって、複数のデータベース接続を使用するには、それらをデータベース構成に追加する必要があります

'dbadvert1' => array(
    'class' => 'CDbConnection',
    ...
)
'dbadvert2' => array(
    'class' => 'CDbConnection',
    ...
)

そしてあなたのコードであなたは次のようなことをすることができます

self::$dbadvert = Yii::app()->getComponent("dbadvert".Yii::app()->request->getQuery('dbid', ''));
于 2012-10-08T13:33:36.393 に答える