GearmanをPHPから使ってみた。
今回は、PHPでGearmanを使えるようにして、ざっと動きを確認してみました。
Gearmanの設定はこっち
ちなみに、よく知らんのだけど、Gearmanは(GearmanClient::doのように)即時実行で結果をclientに返す用途がメジャーなのかな?
ほかのサイトだと、そういう風に紹介されてました。
GearmanCient::doBackgroundをつかうと、TheSchwartzみたい?に
ジョブを突っ込むだけ突っ込んであとはお願いね〜ということができるので
今回はこっちを使います。
はい、まず Gearman PHP Extensionを入れます。
yum install php-devel
wget http://pecl.php.net/get/gearman-0.7.0.tgz
tar xzf gearman-0.7.0.tgz
cd gearman-0.7.0
phpize
./configure
make
make install
OK。
php.iniにextensionの記述を追加します。
CentOSだと/etc/php.d/以下にiniを置けばOKぽいのでそうしてみます。
# iniファイルつくって echo 'extension=gearman.so' | cat > /etc/php.d/gearman.ini # apache再起動 service httpd restart # 動いてるかな? php -r 'print gearman_version();'
僕の環境だと、"0.14"って出力がでました。わーい
さて、さっそくテスト。
まず、worker。
ただ、printするだけ。
worker.php
<?php $worker = new GearmanWorker(); $worker->addServer(); $worker->addFunction('test', 'my_test'); while ($worker->work()); function my_test($job) { print $job->workload()."\n"; }
clientもつくる
client.php
<?php $client = new GearmanClient(); $client->addServer(); $time = time(); print $time."\n"; $client->doBackground("test", $time); if ($client->returnCode() != GEARMAN_SUCCESS) { print "faild add job!\n"; }
できた。
$ php worker.php
でworkerを起動。
別のterminalを開いて
$ php client.php
を実行するとそれぞれ
$ php worker.php
1294802686
$ php client.php
1294802686
となります。ちゃんとjobが渡ってますね。
さて、ここから障害時にどうなるかをちょっとみてみました。
workerが死んでたらどうなるの?
$ php client.php 1294802944 $ php client.php 1294802946
clientは問題なく動きます。
select * from queue; +--------------------------------------+---------------+----------+------------+ | unique_key | function_name | priority | data | +--------------------------------------+---------------+----------+------------+ | 713ed7c0-7e51-4e9a-8f99-76f66693bfd6 | test | 1 | 1294802946 | | 349f796f-6a00-4ef1-ba81-48a3b2a52468 | test | 1 | 1294802944 | +--------------------------------------+---------------+----------+------------+ 2 rows in set (0.00 sec)
mysqlにも溜まってますね。
ここで、workerを動かすと
$ php worker.php 1294802944 1294802946
jobが消化されました。
ここまでは、ジョブキューとして当然の動きですね。
gearmandが死んでたら?
$ php client.php 1294803188 PHP Warning: GearmanClient::doBackground(): gearman_connection_flush:could not connect in /home/toshiyuki/gearman_test/client.php on line 6 faild add job!
もちろん、キューに突っ込めないので、clientがエラーになります。
workerを動かすと
$ php worker.php
お、何ともなく動く。
じゃあ、ここで、gearmandを起動。
gearmand -q libdrizzle --libdrizzle-db=gearman_queue --libdrizzle-table=queue --libdrizzle-user=root -u root -d
$ php worker.php 1294803787 1294803789 1294803789 1294803790
お!来た!! これは想定外。動かないと思ったよ。
gearmand起動から、job実行まで5秒くらいかかりますが、ちゃんと動きました!
ということで、clientのdoBackgroundで例外補足したら、gearmandを起動させて、再度doBackgroundをすれば障害時にも何とかなりそうです。
workerはその際についでに生きてるか確認するか、cronで確認すればOKでしょう。
<?php function errorHandler($no, $msg, $file, $line) { throw new Exception($msg, $no); } set_error_handler('errorHandler'); $client = new GearmanClient(); $client->addServer(); $time = time(); print $time."\n"; $try = 0; while ($try < 3) { $try++; try { $client->doBackground("test", $time); break; } catch (Exception $e) { print "start gearmand!\n"; system('gearmand -q libdrizzle --libdrizzle-db=gearman_queue --libdrizzle-table=queue --libdrizzle-user=root -u root -d'); print "wait: ".($try*$try)."s\n"; sleep($try*$try); } } if ($client->returnCode() != GEARMAN_SUCCESS) { print "faild add job!\n"; }
$ php client.php 1294804988 start gearmand! wait: 1s
わーい入れれた!
TheSchwartzの代わりにGearman+libdrizzleでジョブキューサーバ作る
TheSchwartzはPHPのライブラリないのかね?
ざっと探したけど見つからなかったので、
Gearmanを代わりに使ってみる。
Gearman単体だと、キューがメモリ上に置かれちゃって、落ちたときとかに吹っ飛ぶのでlibdrizzleを使ってMySQLにキューを置くようにします。
# 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 cd .. # 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
インストールは簡単。
さて、MySQLはもう入ってる前提で。
DBつくってキュー用のテーブル作ります。
create database gearman_queue; create table queue ( unique_key VARCHAR(64) PRIMARY KEY, function_name VARCHAR(255), priority INT, data LONGBLOB );
できた。
gearmand起動!
gearmand -q libdrizzle --libdrizzle-db=gearman_queue --libdrizzle-table=queue --libdrizzle-user=root --libdrizzle-password= -d -u root
試しにキューに突っ込んでみる
gearman -f testq -b payload
お、いけてそう
出してみる
gearman -f testq -w
payload
ってでればOK。
突っ込んでから、select * from queue;すると、ちゃんと入ってるのも確認。
わーい意外と簡単にできた。
使い勝手とかは後で書きます!
CentOS5.5にrails環境つくるよ(Passenger)
http://www.thoughtpolice.co.uk/vmware/
からダウンロードできるCentOS5.5にrails環境を作るまでのメモ。
ほかの所でもまとめられているのを知りつつも。
# rootで作業してます。
rubyのインストール。
rubyはyumで入れると、バージョンが古いので、
最新のソースをビルドしてぶち込む。
その前に必要なものを一式ぶち込む。
# add rpmforge repository wget http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt wget http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm rpm -ivh rpmforge-release-0.3.6-1.el5.rf.i386.rpm rpm --import RPM-GPG-KEY.dag.txt # install building tool yum install gcc yum install checkinstall
wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p330.tar.bz2 tar xzvf ruby-1.8.7-p330.tar.bz2 cd ruby-1.8.7-p330 ./configure --prefix=/usr make checkinstall -R --fstrans=no
できたrpmをインストール。
cd /usr/src/redhat/RPMS/i386 rpm -i ruby-1.8.7-p174-1.i386.rpm
gemが動かないので足りてないライブラリをインストール
yum install zlib-devel cd /root/ruby-1.8.7-p330/ext/zlib ruby extconf.rb --with-zlib-include=/usr/include -with-zlib-lib=/usr/lib make make install
gemsが入ってなければ↓
rubyインストールしたら勝手に入ったと記憶。
wget http://rubyforge.org/frs/download.php/73882/rubygems-1.4.2.tgz
tar xvf rubygems-1.4.2.tgz
ruby setup.rb
passengerとpassengerをapacheに組み込むときに使うやつをごそっと。
gem install passenger yum install gcc-c++ yum install curl-devel yum install openssl-devel yum install httpd-devel yum install apr-devel yum install apr-util-devel cd /tmp/ruby-1.8.7-p249/ext/openssl ruby extconf.rb --with-openssl-dir=/usr/local/ssl make make install passenger-install-apache2-module
passenger-install-apache2-module
やると対話形式でインストールされる。特に設定はなかったと思うので、enter連打でOK。
↓をhttpd.confに追記。
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.2/ext/apache2/mod_passenger.so PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.2 PassengerRuby /usr/bin/ruby <VirtualHost *:80> ServerName www.yourhost.com DocumentRoot /somewhere/public # <-- be sure to point to 'public'! <Directory /somewhere/public> AllowOverride all # <-- relax Apache security settings Options -MultiViews # <-- MultiViews must be turned off </Directory> </VirtualHost>
railsをインストール
gem install rails
sqlite3-rubyをインストール。
sqliteのバージョンが古いので、sqlite3-rubyのインストールができないので、sqliteをソースからインストール
wget http://www.sqlite.org/sqlite-autoconf-3070400.tar.gz tar xvf sqlite-autoconf-3070400.tar.gz cd sqlite-autoconf-3070400 ./configure --prefix=/usr make make install gem install sqlite3-ruby
mysql使いたいから
yum install mysql-server mysql-devel gem install mysql2 # install mysql-ruby wget http://rubyforge.org/frs/download.php/69181/mysql-ruby-2.8.2.tar.gz rat xvf mysql-ruby-2.8.2.tar.gz cd mysql-ruby-2.8.2 ruby extconf.rb --with-mysql-config make make install
これで環境構築は完了のはず。
試しにrailsアプリを動かしてみる。(httpd.confの書き換え忘れずに。)
rake new aaa /var/www/rails
で、アクセスしてみる。
production環境で動くので、development環境で動くように。
httpd.confに
RackEnv development
を追加。
mysqlを使う設定
config/database.ymlを変更。
development: adapter: mysql username: root password: host: 127.0.0.1 database: aaa
hostはlocalhostって書くとダメらしい。
mysqlの起動とdb作成
/etc/init.d/mysqld start
rake db:create
これでOK.
間違ってたら指摘してね!
vmware fusion3でcommand+spaceでIME切り替えする
VmwareFusion3が$30 Rebateとのことだったので、買ってみた。
申請フォームだと、アメリカかカナダしか選べなくって住所を無理やり入れてみたんだけど
大丈夫かな。。
ということで、買ったVmwareFusion3はiMacにインスコ。
macbookでは、うまくいってたcommand+spaceでIME切り替えがなぜかできなかったので、焦った。
MacBookAirも我慢できなくなったら買いそうなので、その時のためにメモ。
(MBAだとVMは厳しいか。。容量的にも)
VMwareFusionの環境設定からキーマッピングの設定。
- commandがWindowsキーになっているので、これをcontrolに変更。
- command+FがなぜかF3になっているので、これをcontrol+Fに変更。(control+Fは検索でよく使うので)
- command+spaceをcontrol+spaceに割り当て。(追加する)
- マウスショートカットはデフォルトの2つを外す。
- Fusionショートカットはcommmand+Hをオフに。(置換でよく使う)
これでほぼOKなんだけど、command+spaceを押してもmac側のIMEが切り替わってしまう。。
macのシステム環境設定から
キーボード=>キーボードと文字入力
- 前の入力ソースを選択にalt+command+spaceを割り当て。
- 入力メニューの次のソースを選択にcommand+spaceを割り当て。
これでOK。
そういえばiMac買ったんだ。
生きてますよ。
ついこの間、iMac 27inch Late 2009を買いました。
ついに買っちゃいました。
その前に、ノートPCも EeePCからMacBook Pro 13inchにしたんだけどね。
その前には、iPhone4 16G買ったな。
と、完全にApple信者になってしまったわけです。
さて、iMacですが、かなり安く買えました。
ヤマダ電機で開梱品が売ってたんですねー
実はその日に別の店舗で激安90000くらいで売ってたんだけどね。
そっちは無理だろ。。ということで翌日昼頃に池袋総本山にいってみたら
119800でQuad Coreの27inchが売ってたわけです。
(27inchの下位モデルは99800だった)
開梱品のためAppleCareは2ヶ月で切れるとのことだったんだけど
商品登録してみたら2009/10/21(発売日)に買ったと登録しても通らない。
問い合わせしてみたものの返事が遅いので1日づつ変えて試してみたら
半年分くらいのsubmitでやっと通った。
なんと開梱日は2010/5/21でした。3ヶ月ちょいしか展示してなかったのが偶然あたったのか。ラッキーでしたわ
開梱品はそれなりに心配ではあるのでAppleCare Protection Planを別途購入あと2年7ヶ月くらい?は心配なく使えそうです。
で、iMacの使い心地。
これ最高ね。画面も超絶きれいだし、広いし。
MacはUIがWin,Linとはちょっと違うからなれるまで大変かなーと思ってたけどそんなこと全くなし。
全然こっちの方がいい。
安定性も抜群。初期インストールアプリも完成度超高いし。
さくさくで快適です。
あと、配線が電源一本でOKなのもすばらしい。どこからみてもかっこいい。
Magick Mouseにワイヤレスキーボードもすばらしい出来。
電池も異常なほど持ちます。
そこらのワイヤレスマウスとは別物です。
スリープ運用もMacBook買ったあとに、そうなんだーと思ったんだけど
MacBookもiMacもスリープ運用だと
触った瞬間に起動する感じで使えるから、すばらしい。
iMac買う前は朝iPadでメールチェックしてたけど、
今はiMacでざらっとチェック。返信もささっと。
まえのPCだったら起動だけでメールチェックと返信時間つぶしちゃうくらい。
ということで自慢しまくりでした。
あ、iMacは文字通り熱いやつなので、最初はビビったけど、こんなもんらしい。
iPadの悩み。
WIFI 16Gしか頭に無かったのに、
ソフトバンクの料金プランのせいで3Gを買うべきかめちゃくちゃ迷っております。
料金プランの設定を見ると
3Gなら16Gか64Gでしょう。
32Gが一番コストパフォーマンスが良くない。
- 0円で16Gで我慢するか、+800円で64Gにするか。。
どれだけ外で使うかにかかってるんだよね〜
これはiPadを持ってみないと何とも言えない。
iPhoneはなるだけ3G回線使わないで行こうと思ってたけど、
どこでも使えるって便利だしね。
電車であれでネットサーフィンするかね。iPhoneで済ませそうな気もしてきた。
それと、WindowsのVPS借りてそれにアクセスするための端末としても使えそうな気がしてきたので、
それもいいなぁ〜とか。
とりあえず、予約は置いといて動向を見守るか。。
懸念としては、
256Mのメモリで大丈夫なのか
ってのと(OS4.0になったときに心配)
3Gは契約解除後もWIFI onlyとしても使えるのかってこと。
契約解除後は使えないんだったらWIFI 16Gだろうな。