Gearman + PHP でジョブサーバを作ったが、
Gearmanはジョブをメモリに保存するので、
再起動とかするとジョブが消える。
なので、ジョブをMySQLに保存する。
他のサイトだと、
libdrizzle とか MySQL-UDF を使ってるけど、
前回インストールしたノーマルGearmanでいけた。
前回のインストールは以下です。
http://d.hatena.ne.jp/pospome/20130822/1377162141
MySQLはインストールしておく。
【MySQLにDBとテーブルを作る】
CREATE DATABASE gearman; CREATE TABLE queue ( unique_key VARCHAR(255), function_name VARCHAR(255), priority INT, data LONGBLOB, when_to_run BIGINT, unique key (unique_key, function_name) );
---追記 2013/09/23 ---
queueテーブルの unique_key が varchar(500) だと、
ユニーク制約を付与できないので、
varchar(255)に修正しました。
---------------------
【起動する】
gearmand -q MySQL --mysql-user=root --mysql-password=pass --mysql-db=gearman --mysql-table=queue -d
---追記 2013/09/23 ---
DBが別ホストの場合は「--mysql-host=192.168.xx.xx」のように
ホストを設定する。
このとき、DBサーバのFireWallやSELinux、MySQLのユーザーアカウントのホスト指定を確認すること。
特にMySQLのアカウントをミスると以下のエラーが出ます・・・。
ERROR 1129 (HY000): Host '192.168.11.110' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
http://d.hatena.ne.jp/pospome/20130923/1379933439
---------------------
以上でOK。
前回のインストール時と起動方法が違うだけ。
と言っても 「/etc/init.d/gearmand」にオプションを設定すれば同じです。
動作確認は以下の記事の worker.php と client.php を用意してやってみる。
http://d.hatena.ne.jp/pospome/20130822/1377162141
client.php を実行してジョブを登録したら、
MySQLのテーブルを確認してみる。
ジョブが登録されているはず。
worker.php を実行すると、MySQLのジョブも削除される。
ちなみに、他のサイトではソースをmakeして色々やってるけど、
自分はうまくいかなかった・・・orz
参考までにその時のログを載せます。
【ソースからインストール】
//libevent-develが別途必要。
#yum install libevent-devel
//最初にlibdrizzleをインストール
#wget http://launchpad.net/libdrizzle/trunk/0.8/+download/libdrizzle-0.8.tar.gz
#tar xzf libdrizzle-0.8.tar.gz
#cd libdrizzle-0.8
#./configure
#make
#make install
#yum -y install boost-devel
#yum -y install gcc-c++
#yum -y install gperf
#yum -y install mysql-devel
//gearmand インストール
#wget http://launchpad.net/gearmand/trunk/0.14/+download/gearmand-0.14.tar.gz
#tar xzf gearmand-0.14.tar.gz
#cd gearmand-0.14
#./configure
#make
#make install
確認する。
#gearmand --help
これで以下のエラーが出たら、libdrizzleが認識されていない。
gearmand: error while loading shared libraries: libdrizzle.so.9: cannot open shared object file: No such file or directory
//libdrizzleのライブラリをOSに認識させる
//このファイル名は何でもいいが、拡張子はconfにする。
#vim /etc/ld.so.conf.d/libdrizzle.conf
//以下のローカルライブラリディレクトリを書き込む。
/usr/local/lib/
ライブラリを更新する。
#ldconfig
起動する。
このとき -l オプションでログファイルを指定しないと
デフォルトのログファイルが「/usr/local/var/log/gearmand.log」になり、エラーが出る。
#gearmand -d -l /var/log/gearmand.log
【PHPのGearmanライブラリをインストールする】
# yum -y install libgearman-devel
# pecl install gearman
extension = gearman.so を php.ini に追記する。
【libdrizzleとGearmanを連携させる】
gearmand -q libdrizzle --libdrizzle-port=3306 --libdrizzle-db=gearman --libdrizzle-table=my_queue --libdrizzle-user=root --libdrizzle-password=pass -d -u root -l /var/log/gearmand.log --libdrizzle-mysql
ここで、「gearmand: Error while initializing the queue : libdrizzle」のエラーが出て詰む・・・。