個人用ツール

OpenPNE3ノウハウ:画像などのアップロードされたデータだけ別のデータベースに保存する

提供: OpenPNE3まとめwiki

移動: 案内, 検索

OpenPNE3は日記などでアップロードされた画像などをすべてデータベースに保存するため、その量が多くなるとデータベースのバックアップに時間が掛かってしまいます。file・file_binテーブルを隔離できれば画像だけバックアップの頻度を少なくするといったことも可能になるので、できるかどうか試した記録をここに残しておきます。参考程度にどうぞ。

手順

※ この手順はOpenPNE3を最初からインストールすることを前提としています。すでに使用しているデータを消さずに移行する方法は自分で調べて下さい。
※ 見ての通りとてもいい加減な方法なので、環境によっては失敗してデータが消えたり読み込めなくなったりするかもしれません。
※ データベースをマスター・スレーブに分割する構成にする場合はこの方法は使えません

1. ここではアップロードされたデータをMySQLではなくSQLiteデータベースに保存します。前もって必要なパッケージ等をインストールしておいて下さい。Debian等の場合は、

sudo aptitude install sqlite3 php5-sqlite

で必要なものがインストールされます。

2. 次に config/ProjectConfiguration.class.php を修正します。ファイル中の setupProjectOpenPNEDoctrine の部分を下記のように書き換えて下さい。

  public function setupProjectOpenPNEDoctrine($manager)
  {
    // You can write your own configurations.
 
    // In default, OpenPNE uses foreign key.
    // If you want not to use foreign key, comment out the following configuration:
    // $manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_ALL ^ Doctrine::EXPORT_CONSTRAINTS);
 
    $manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_ALL ^ Doctrine::EXPORT_CONSTRAINTS);
    $manager->openConnection('sqlite:openpne3-uploads.sqlite', 'slave-uploads');
    $manager->bindComponent('File', 'slave-uploads');
    $manager->bindComponent('FileBin', 'slave-uploads');
  }

3. さらにOpenPNE3自体にも修正を加えます。lib/util/opDoctrineQuery.class.php の preQuery の部分を下記のようにコメントアウトして下さい。

/*
  public function preQuery()
  {
    if ($this->specifiedConnection)
    {
      $this->_conn = $this->specifiedConnection;
    }
    else
    {
      $this->_conn = self::chooseConnection($this->shouldGoToMaster, $this->getType());
    }
  }
*/

4. lib/util/opDoctrineRecord.class.php の save の部分を下記のようにコメントアウトして下さい。

/*
  public function save(Doctrine_Connection $conn = null)
  {
    if (is_null($conn))
    {
      $conn = opDoctrineQuery::chooseConnection(true);
    }
 
    parent::save($conn);
  }
*/

5. OpenPNE3のインストールを実行します。

php symfony openpne:install

6. 何事もなく使用できれば成功です。