Techracho

Ethna_DBでfetchArrayのようなことをする

このエントリーをはてなブックマーク Share
2010.03.03    Ethna, PHP, 馬場   タグ: —    baba   

PHPでmysql_queryの結果オブジェクトは、mysql_fetch_row()しても良いですが、mysql_fetch_array()した方が便利ですよね。
※mysql_fetch_row()では、結果を通常の配列で取得しますが、mysql_fetch_array()では、カラム名をキーにした連想配列で取得できます

EthnaでAppObjectを使わずにEthna_DBを直接たたく場合、結果オブジェクトはPEAR::DB_Resultオブジェクトです。
これはfetchRow()のメソッドを持ちますが、fetchArray()は存在しません。
http://pear.plus-server.net/package.database.db.db-result.fetchrow.html

カラム名をキーにした連想配列が欲しい場合、queryを投げる前にsetFetchMode(DB_FETCHMODE_ASSOC)を実行しておく必要があります。
http://pear.plus-server.net/package.database.db.db-common.setfetchmode.html

EthnaのデフォルトDBアダプタ、DB_PEARは、内部にPEAR::DBを持っているので、以下のようなコードを書けばOKです。

$db = $this->backend->getDB();
$db->db->setFetchMode(DB_FETCHMODE_ASSOC);
$res = $db->query($sql);
print_r($res->fetchRow());

http://ethna.jp/ethna-document-dev_guide-db.html
Ethnaの デフォルトの DB接続クラス(Ethna_DB_PEAR) はPEAR::DBを継承しているので
と書いてありますが、継承ではなくて委譲なので、$db->db->setFetchMode()となります。

dekiwikiで画面が真っ白に

このエントリーをはてなブックマーク Share
    MindTouch Deki, 馬場   タグ: —    baba   

社内のサーバを仮想化したのに伴い、社内wikiとして使っているdekiwikiも環境移行しました。

dekiwikiは優れたツールですが、移行やバージョンアップはいまいち考えられていない感もありますね。
次のような手順で移行しました。

・新サーバで、aptitudeから普通にdekiwikiをインストール(この際、DBパスワードなどを同じにしておく)
・旧サーバのmysqlデータを、新サーバにコピー
・/var/www/dekiwiki/attachments 以下を、新サーバにコピー

これで一通りは使えるようになります。
インストール後はコントロールパネルからキャッシュの再構築が必要です。

ついでにmonoをバージョンアップしたせいか、動作が劇的に速くなりました。古いmonoはCPUをずっと食い散らかしていたので、何かバグがあったのでしょう。

しかし、新wikiでは以下の問題が発生しました。
・検索すると画面が真っ白になる
・コントロールパネル「削除済みファイル」を開くと画面が真っ白になる

これは2つの問題が複合していました。

まず削除済みファイルの件ですが、attachmentsの中身のコピーが不完全で、エラーになっていたようです。
ファイルのインデックスはmysqlに保存されるため、インデックスが存在してファイル実体が無い場合、エラーになってしまいます。
/var/log/dekiwiki/deki-api.log に表示されるエラーを参考にしながら、完全なコピーを実施します。万が一ファイルを無くしてしまっていたら、とりあえず同名ダミーファイルでもおいておけば良いかもしれません。

次に検索が出来ない件ですが、PHPのメモリ不足でした。
php.iniでmemory_limit を16MBから64MBにしたら、無事検索できるようになりました。ページやファイル数が多くなっているため、結構メモリを食うのですね。

PHPエラーを出力する設定にしないと気づかないので注意が必要です。

COPYRIGHT [C] 2009 BEYOND PERSPECTIVE SOLUTIONS LTD. ALL RIGHTS RESERVED.