phpMyAdminで困ったらAdminerを使え! その2

カテゴリ: WEB、WEBシステム関連 / 公開日: 2013年6月29日(土曜)20:48 / 投稿者: Tom Goodsun

Adminerとの出会い

検索してみた。
「phpMyAdmin 置き換え」や「phpMyAdmin slow」(phpMyAdmin 重たい)で検索すると出てくるのがAdminer。
オフィシャルにもある通りphpMyAdminを置き換えることができるウェブベースのデータベースアドミニストレーションツールだ。

Adminerのテーブル一覧画面

こいつが爆速なのである。
正味数十分かかっていたページの表示やデータ検索が1分以内に終わる。
数字的にはパフォーマンスよくないじゃんって思うかもしれないが、今までのphpMyAdminでの作業を考えれば劇的なパフォーマンス改善だ。

担当者も、
「めちゃくちゃ早いわ。数十分かかってた作業が数分で終わる!これ使うわ!」
とのこと。

phpMyAdminほど高機能でもないが、それでもデータ検索、変更、定義の変更などアドミニストレーションできる。
フォームによる検索もできる。
もうphpMyAdminは特に必要な用途でしか使わないだろう。

Adminerのフォーム検索
phpMyAdminのフォーム検索

驚いたのはプログラムソース

AdminerのオフィシャルからAdminer for MySQLのソースをダウンロードしたが驚いだ。
難読化、ミニファイしているソースなのだが、必要なのがPHPファイル一つだけというのには正直驚いた。
ソース版をダウンロードすると確かにソースの数は多い。
それでもミニファイして300K以下とは。おそらくこれもパフォーマンスに寄与しているだろう。
それでありながらデフォルトで日本語を含む多くの言語に対応しているというのも驚きだった。

そして改造へ

どうしても改造しておく必要があったのが、データベースの部分だ。
デフォルトだとホスト名はテキストボックスで入力しなくてはならない。
分散したサーバー構成の場合、サーバーのホスト名の入力は結構面倒だ。(AWSのエンドポイントURLを入力しろとかマジ勘弁って感じです。)

なので、そこはプルダウンリストボックスで選択できるように変更した。

まずは以下のファイルを用意。

config.php
<?php
/**
 * Database Server list for Adminer
 *
 * @date 2013.06.30
 * @author Tom Higuchi (http://www.tom-gs.com/)
 */

$CONFIG_SERVERS = array(
    //'name of host' => 'hostname',
    'db1' => '127.0.0.1:3306',
    'db2' => '127.0.0.1:3306',
    'db3' => '127.0.0.1:3306',
);
ex_libraries.php
<?php
/**
 * Extended config manager for Adminer
 *
 * @date 2013.06.30
 * @author Tom Higuchi (http://www.tom-gs.com/)
 */

class AdminerExConfig {
    /**
     * Gete Server List
     *
     * @return array List of preset servers
     */
    public static function getServers() {
        global $CONFIG_SERVERS;
        if (!is_array($CONFIG_SERVERS)) $CONFIG_SERVERS = array();
        return $CONFIG_SERVERS;
    }

    /**
     * Print server list in HTML
     * If preset servers are detected, write them in select tag.
     * But not detected, write input form
     *
     * @param string $prev_server = NULL  Previous connected server
     */    
    public static function printServerList($prev_server = NULL) {
        $html .= '';
        $servers = self::getServers();
        if (count($servers) > 0) {
            $html .= '<select name="auth[server]" title="hostname[:port]">';
            foreach ($servers as $verbose => $server) {
                $selected = '';
                if ($server == $prev_server) $selected = 'selected="selected"';
                $html .= sprintf('<option value="%s" %s>%s</option>', h($server), $selected, h($verbose));
            }
            $html .= '</select>';
        } else {
            $html .= '<input name="auth[server]" value="' . h(SERVER) . '" title="hostname[:port]" placeholder="localhost" autocapitalize="off">';
        }
        echo $html;
    }
}

index.php
<?php
/**
 * Inclue files
 */
require_once(dirname(__FILE__) . '/' . 'config.php');
require_once(dirname(__FILE__) . '/' . 'ex_libraries.php');
require_once(dirname(__FILE__) . '/' . 'adminer-3.7.0-mysql.php');

そしてダウンロードしたadminer-3.7.0-mysql.phpの322行目を以下のように変更する。

<tr><th>',lang(17),'<td>',html_select("auth[driver]",$_b,DRIVER,"loginDriver(this);"),'<tr><th>',lang(18),'<td>',AdminerExConfig::printServerList(SERVER),'

通常のログイン画面

改造したログイン画面

あとはスキンを変えたり、プラグインで機能を拡張したりすれば、どんどん協力になっていくだろう。
(プラグインのロードプログラムは自分で書かないといけないようだ。ただし、サンプルコードの記載がある。)


デフォルトのスキン
オフィシャルで公開されているスキンDavid Grudl