Gearman-MySQL-UDF をインストールする
MacPorts でインストールした MySQL に Gearman-MySQL-UDF をインストールする。
Gearmand を MacPorts でインストール
$ sudo port install gearmand $ sudo port load gearmand $ ps -eaf | grep gearmand 0 66518 1 0 0:00.01 ?? 0:00.02 /opt/local/bin/daemondo --label=gearmand --start-cmd /opt/local/sbin/gearmand -vv --port=4730 -u root --pid-file=/opt/local/var/run/gearmand.pid --log-file=/opt/local/var/log/gearmand.log ; --pid=exec 0 66519 66518 0 0:00.00 ?? 0:00.00 /opt/local/sbin/gearmand -vv --port=4730 -u root --pid-file=/opt/local/var/run/gearmand.pid --log-file=/opt/local/var/log/gearmand.log
Gearman-MySQL-UDF をダウンロード&インストール
$ wget http://launchpad.net/gearman-mysql-udf/trunk/0.5/+download/gearman-mysql-udf-0.5.tar.gz $ tar xvzf gearman-mysql-udf-0.5.tar.gz $ cd gearman-mysql-udf-0.5 $ ./configure --with-mysql=/opt/local/bin/mysql_config5 --libdir=/opt/local/lib/mysql5/mysql/plugin CPPFLAGS="-I/opt/local/include" LDFLAGS="-L/opt/local/lib" DEPS_CFLAGS="-I/opt/local/include" DEPS_LIBS="-L/opt/local/lib" $ make $ sudo make install $ cd /opt/local/lib/mysql5/mysql/plugin/ $ ls | grep *gearman* libgearman_mysql_udf.la:dlname='libgearman_mysql_udf.0.so' libgearman_mysql_udf.la:library_names='libgearman_mysql_udf.0.so libgearman_mysql_udf.so'
MySQL で Gearmand-UDF を登録
$ mysql5 -u root mysql> CREATE FUNCTION gman_do RETURNS STRING -> SONAME "libgearman_mysql_udf.so"; Query OK, 0 rows affected (0.00 sec) mysql> CREATE FUNCTION gman_servers_set RETURNS STRING -> SONAME "libgearman_mysql_udf.so"; Query OK, 0 rows affected (0.00 sec) mysql> select gman_servers_set("127.0.0.1:4730"); +------------------------------------+ | gman_servers_set("127.0.0.1:4730") | +------------------------------------+ | 127.0.0.1:4730 | +------------------------------------+ 1 row in set (0.00 sec)
Worker を作る。
動作確認用なので Perl で作成した。
# Python の場合ライブラリのバージョンがあがったみたいでうまいこと行かなかった…。
#!/usr/bin/env perl use strict; use warnings; use Gearman::Worker; my $worker = Gearman::Worker->new; $worker->job_servers('127.0.0.1:4730'); $worker->register_function(reverse => sub {reverse $_[0]->arg;}); $worker->work while 1;
worker.pl とかで保存して実行する。
MySQL で UDF を呼び出す。
mysql> select gman_do('reverse', 'Hello world'); +-----------------------------------+ | gman_do('reverse', 'Hello world') | +-----------------------------------+ | dlrow olleH | +-----------------------------------+ 1 row in set (0.00 sec)
ちゃんと文字が反転して応答された。
参考文献
http://d.hatena.ne.jp/perezvon/20090501/1241156643
※ Python で上記の GearmanWorker を動かす場合は 1.5.0 じゃないと動かない。最新は 2.x 系。
http://oddments.org/?p=31