これで完璧!Q4MをCentOS5.4にインストールしphpで実行する方法!
前回の記事では中々満足のいく結果が出せませんでした。
Q4MをCentOS5.4にインストールしphpで実行しました。 - @camelmasaの開発日記
もっと簡単にQ4Mをインストールし、かつ前回出来なかったphpからqueue_abort()を出来るようにしたいと思います。
PHP5.3.1とMySQL5.1.43をyumでインストール
PHP5.3.1でなくても良いのですが、前回PDOからqueue_abort()が出来なかったので、今回はopenpearで提供されているNet_Q4Mを使用したいと思い、PHP5.3.1をインストールします。
(Net_Q4Mはphp5.2.0以上が必要)
MySQL5.1.43はQ4MがMySQL5.1以上が必要ということですのでyumからインストールします。
CentOSの通常のリポジトリだけだと、PHP5.3.1とMySQL5.1.43は出来ないのですが下記の記事を参考にしてリポジトリを追加してインストールしました。(ついでにMySQLをconfigureする為に必要なパッケージもいれます。)
CentOS 5.3 に php-5.2.9, mysql-5.1.35 をインストール(remi レポジットリより) | お試しlog4
wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm wget http://rpms.famillecollet.com/el5.i386/remi-release-5-6.el5.remi.noarch.rpm wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm rpm -Uvh *.rpm yum --enablerepo=remi,epel,rpmforge update yum --enablerepo=remi,epel,rpmforge install php-gd php-mbstring php-mysql php-odbc php-pdo php-pear mysql* yum --enablerepo=remi,epel,rpmforge install gperf readline-devel ncurses-devel zlib-devel gcc gcc-c++ autoconf automake libtool rpm-build boost boost-devel
(この時、5.1.43では無いパッケージがインストールされる場合、mysql*では無く、mysql-5.1.43 mysql-server-5.1.43 mysql-devel-5.1.43 をインストールしないと駄目だった。)
MySQLを起動します。
/etc/init.d/mysqld start
MySQL-community-5.1.43-1.rhel5.src.rpmとq4m-0.9.tar.gzの入手
MySQL-community-5.1.43-1.rhel5.src.rpmとq4m-0.9.tar.gzを入手して展開します。
cd /usr/local/src wget http://dev.mysql.com/get/Downloads/MySQL-5.1/MySQL-community-5.1.43-1.rhel5.src.rpm/from/http://ftp.jaist.ac.jp/pub/mysql/ wget http://q4m.31tools.com/dist/q4m-0.9.tar.gz tar zxfv q4m-0.9.tar.gz
MySQL-community-5.1.43-1.rhel5.src.rpmをリビルドします。
MySQL-community-5.1.43-1.rhel5.src.rpmをリビルドします。
rpmbuild --recompile --define 'community 1' MySQL-community-5.1.43-1.rhel5.src.rpm
Q4Mをビルド&インストール
Q4Mをビルドします。
cd ./q4m-0.9 ./configure --with-mysql=/usr/src/redhat/BUILD/mysql-5.1.43 make make install
./configureの実行時、"failed to locate mysql 5.1 installation"というエラーが表示された場合、mysql系の何かのパッケージがインストールされていない場合があります。
(今回のケースではyumでmysql*をインストールしているので、どのパッケージか特定していません。)
これでQ4Mがインストールされました。
次にQ4Mの動作準備します。
/usr/bin/install -c support-files/q4m-forward /usr/bin mysql -u root -f mysql < support-files/install.sql
これでQ4Mの動作準備完了です。
Q4Mがインストールされているか確認
Q4Mがインストールされているか確認します。
mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.1.43 MySQL Community Server (GPL) by Remi Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show plugins; +------------+----------+----------------+--------------------+---------+ | Name | Status | Type | Library | License | +------------+----------+----------------+--------------------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | partition | ACTIVE | STORAGE ENGINE | NULL | GPL | | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL | | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL | | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL | | FEDERATED | ACTIVE | STORAGE ENGINE | NULL | GPL | | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL | | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL | | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | ndbcluster | DISABLED | STORAGE ENGINE | NULL | GPL | | QUEUE | ACTIVE | STORAGE ENGINE | libqueue_engine.so | GPL | +------------+----------+----------------+--------------------+---------+ 12 rows in set (0.08 sec)
一番下にQUEUEの列!
プラグインの一覧に追加されているのが確認出来ました。
MySQLにQUEUEのストレージエンジンを使用したテーブルを用意
MySQLにQUEUEのストレージエンジンを使用したテーブルを用意します。
mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.1.43 MySQL Community Server (GPL) by Remi Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> create database q4m; Query OK, 1 row affected (0.00 sec) mysql> use q4m; Database changed mysql> create table my_queue(id int not null, name varchar(25) not null ) engine=queue; Query OK, 0 rows affected (0.03 sec)
openpear/Net_Q4Mのインストール
openpearのチャンネルをインストール後、pearコマンドでNet_Q4Mをインストールします。
pear channel-discover openpear.org pear install openpear/Net_Q4M-beta
これでOK。
phpからQ4Mを操作
以下のphpでQ4Mを操作してみます。
Net_Q4MのコンストラクタであるDSN部分は適当な値を設定して下さい。
<?php require_once ('Net/Q4M.php'); $queue = new Net_Q4M('mysql://user:pass@localhost/database'); $queue->connect(); while(true) { $row = $queue->dequeue('my_queue'); var_dump($row); if ($row) { $queue->end(); } else { $queue->abort(); } } $queue->disconnect();
phpで実行
php q4m.php buildQueryString(): SELECT queue_wait('my_queue')
別の端末からMySQLでinsertすると…?
mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 Server version: 5.1.43 MySQL Community Server (GPL) by Remi Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use q4m; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> insert into my_queue values(1, 'hello world'); Query OK, 1 row affected (0.00 sec)
php q4m.php buildQueryString(): SELECT queue_wait('my_queue') buildQueryString(): SELECT * FROM my_queue array(4) { [0]=> string(1) "1" ["id"]=> string(1) "1" [1]=> string(11) "hello world" ["name"]=> string(11) "hello world" } buildQueryString(): SELECT queue_end() buildQueryString(): SELECT queue_wait('my_queue')
上手くスクリプトが実行されました。
Net_Q4Mの作者さんのサイトにサンプルスクリプトがあるのですが、Net_Q4Mのバージョンが上がっているせいか、コンストラクタでDSNの値を引数にいれる仕様になっていました。
http://castor.s26.xrea.com/blog/tech/tech00017.html
まとめ
前回と同様、簡単にインストール…とはいきませんでした。
現段階ではrebuildしたMySQLを使用する方法しか見当たりません。
しかし、Q4Mのabort()が実行出来るのが確認出来たので収穫ありとしたいと思います。
追記
Q4M 0.9.2をインストールした方が良いかもしれないですね。
http://developer.cybozu.co.jp/kazuho/2010/01/thanks-to-a-use.html
[PR]Spreeの情報を集めています。
ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/
Q4MをCentOS5.4にインストールしphpで実行しました。
Q4Mはid:kazuhookuさんが開発したMySQLでメッセージキューを実装するストレージエンジンです。
思わぬ機会でQ4Mに触れる事が出来たので実際に構築〜phpでの実行を記事にしました。
インストール
インストールには下記の記事を参考にしました。
Q4M on CentOS - dragon3のブログ
MySQLのバージョンが違うだけで、上記と同じ作業で行いました。
VMwareで環境を構築したのですが、MySQLをビルドするのに物凄く時間がかかるのが注意です。
(4,5時間掛かったかな?)
phpで実行
phpでの実行には下記の記事を参考にしました。
http://blog.xole.net/article.php?id=719
PDOで実行する為に必要な事を下記に示します。
php-pdoのインストール
yum install php-pdo
pdo-mysqlのインストール
pecl pdo_mysql
php.iniの編集
;;;;;;;;;;;;;;;;;;;;;; ; Dynamic Extensions ; ;;;;;;;;;;;;;;;;;;;;;; ; ; If you wish to have an extension loaded automatically, use the following ; syntax: ; ; extension=modulename.extension ; ; For example: ; ; extension=msql.so ; ; Note that it should be the name of the module only; no directory information ; needs to go here. Specify the location of the extension with the ; extension_dir directive above. extension=pdo.so extension=pdo_mysql.so
MySQLのユーザー、パスワードを適当に設定して、参考のphpを実行しました。
<?php $conn = new PDO('mysql:host=localhost; dbname=hogetest', 'user', 'password'); $wait = $conn->prepare('SELECT queue_wait("hoge_queue", 10)'); $abort = $conn->prepare('SELECT queue_abort()'); $e = $conn->prepare('SELECT queue_end()'); $select = $conn->prepare('SELECT * FROM hoge_queue'); while(true){ $start = time(); // for epch tstmp // wait call query $wait->execute(); $end = time(); echo 'wait for: ', $end - $start, ' sec.', PHP_EOL; echo 'is_queue: ', $wait->fetch(PDO::FETCH_COLUMN), PHP_EOL; $select->execute(); while($row = $select->fetch(PDO::FETCH_OBJ)){ var_dump($row); // // delete しなくとも queue_end で消える // $e->execute(); continue 2; } // abort cal // abortを実行するとphpエラーが起こるのでコメント化 //$abort->execute(); echo 'next...', PHP_EOL, PHP_EOL; }
無事にQ4Mを楽しむ事が出来ました。
$abort->execute();を実行すると表示されるエラー
[root@localhost ~]# php q4m.php
wait for: 10 sec.
is_queue: 0
PHP Fatal error: Call to a member function execute() on a non-object in /root/q4m.php on line 29
mysql> SELECT queue_abort(); ERROR 1123 (HY000): Can't initialize function 'queue_abort'; queue_abort(): not in owner mode
むう。。。
まとめ
Q4Mの利点は、プログラムをフロントエンドとバックエンドで分離する事で処理を高速化する事が出来る事だと思います。(他人の受け売りです。)
構築〜実装が複雑では無いので、どんどん取り入れたい技術だと思います。
(唯、SELECT queue_abort()が実行出来なかったのは仕様なのか、構築時のミスなのか気になるところです…。)
追記
Q4Mの構築自体に問題は無さそうですが、スクリプトに問題がありそう。現在調査中。
なんだか2回目のwhileに絶対入らない…。PDO内のスクリプトにバグがあるのかな…。
MySQL内では問題なかった…。
[PR]Spreeの情報を集めています。
ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/
phpのmb_substrで発生する文字化けの対処方法
phpのmb_substrで発生する文字化けの対処方法です。
mb_substr($hoge, 0, 20, 'utf-8')
第3引数に適切な文字コードを入力する事で、文字化けを回避できます。
まとめ
余り使う事は無いのですが、私が躓いてしまったので記事にしました。
[PR]Spreeの情報を集めています。
ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/
phpの三項演算子を書いてていつも思っていた事を書きます。
私は結構三項演算子を多用してしまうのですが、下記のようなケースの時とても面倒臭いと感じてしまいます。
<?php (($a) ? $a : $b); //もしくは ((strlen($a)) ? $a : $b); ?>
いつも、「きっともっと良い書き方があるんだろうな」と思っていましたが、調べたりはしていませんでした。
早速調査
マニュアル内にて
PHP 5.3 以降では、三項演算子のまんなかの部分をなくすこともできるようになりました。 式 expr1 ?: expr3 の結果は、expr1 が TRUE と同等の場合は expr1、 それ以外の場合は expr3 となります。
php 5.3 以降からですか〜。
ロリポップ!レンタルサーバー | 利用実績170万人突破!無料SSLあり
ナウでヤングでもphp 5.2.6ですよ。
つまりphp 5.3 以降からは
<?php (($a) ?: $b); //もしくは ((strlen($a)) ?: $b); ?>
といった書き方が出来るという事ですね。
更に調査
http://cocoasaurus.com/blog/2009/04/tips-if.html
論理和演算子でいけるんでないかと考えました。
<?php $hoge = "hoge"; echo $hoge || $foo; //hogeが出力されると思いましたが、1が出力されました。 ?> <?php $hoge = "hoge"; $foo = "foo"; echo $hoge || $foo; //1が出力される。 ?>
むむむ…。
[PR]Spreeの情報を集めています。
ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/
symfony1.0.20のView部分の単純な所で躓いてしまいました。
symfony1.0.20のView部分の単純な所で躓いてしまいました。
$sf_user->getAttribute()と$sf_params->get()を間違えるという大失態...。
あちゃ〜。
2時間程気づかなかったよ〜…。
[PR]Spreeの情報を集めています。
ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/
PEARパッケージImage_Colorful 0.1.3-stableをリリースしました。
PEARパッケージImage_Colorful 0.1.3-stableをリリースしました。
- Colorfulという親クラスを作成
- Image_Colorful_Wordという子クラスを作成
Image_Colorful_Wordという子クラスは、生成される文字列からサイズを自動で計算して画像サイズを決定します。
画像サイズが変化してしまうというデメリットがありますが、簡単なロゴの作成に向きますし、何より画像に文字を表示する時に縦pxと横pxを意識せずに画像が作成出来ます。
文字自体を動的に変化させたい画像を作成したい場合、とても有効なパッケージです!
こんな感じの画像が動的に作成出来ます。
前回と同様これも春な感じで良いですねー。
sample.php
<?php require_once('Image/Image_Colorful_Word.php'); $image = new Image_Colorful_Word('ImageCalorfulWord', './font/altan.ttf', 50, array(5,5,5,5), array(255,255,255), 50, 1); $image->addColors(150,150,150); $image->getGenerateImage('png'); ?>
sample2.php
<?php require_once('Image/Image_Colorful_Word.php'); $image = new Image_Colorful_Word('camelmasa@gmail.com', './font/cecily.ttf', 13, array(1,1,1,1), array(255,255,255), 20, 1); $image->addColors(150,150,150); $image->getGenerateImage('png'); ?>
sample3.php
<?php require_once('Image/Image_Colorful_Word.php'); $image = new Image_Colorful_Word('camelmasa@gmail.com', './font/bacon.ttf', 13, array(1,1,1,1), array(255,255,255), 20, 1); $image->getGenerateImage('png'); ?>
ちょっとコンストラクタがウザいかもしれません…。
修正が必要かも。
PEAR Image_Colorfulパッケージのインストール方法
[PR]Spreeの情報を集めています。
ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/
PEARパッケージImage_Colorful 0.1.2-stableをリリースしました。
PEARパッケージImage_Colorful 0.1.2-stableをリリースしました。
- addTextsメソッドの修正
addTextsメソッドの修正により、物凄く簡単に文字を追加する事が出来ます。
主な修正はaddTextsメソッドの第6引数(省略可)に、UPPER_LEFT,UPPER_RIGHT,CENTER,LEFT_LOWER,RIGHT_LOWERの定数を設定すると、文字列表示の初期の位置が変わります。
こんな感じの画像が動的に作成出来ます。
春な感じで良いですねー。
sample.php
<?php require_once('Image/Image_Colorful.php'); $image = new Image_Colorful(685,100,175,1); $image->addColors(150,150,150); $image->addTexts('upperleft', './font/altan.ttf', '30', '10', '10', array(255,255,255), 'UPPER_LEFT'); $image->addTexts('upperright', './font/altan.ttf', '30', '10', '10', array(255,255,255), 'UPPER_RIGHT'); $image->addTexts('center', './font/altan.ttf', '30', '0', '0', array(255,255,255), 'CENTER'); $image->addTexts('leftlower', './font/altan.ttf', '30', '10', '10', array(255,255,255), 'LEFT_LOWER'); $image->addTexts('rightlower', './font/altan.ttf', '30', '10', '10', array(255,255,255), 'RIGHT_LOWER'); $image->getGenerateImage('png'); ?>
PEAR Image_Colorfulパッケージのインストール方法
PEAR Image_Colorfulパッケージの使用方法(コンストラクタとメソッドについて)
- コンストラクタ $image = new Image_Colorful([画像の幅(px)], [画像の高さ(px)], (省略可:通常1)[横の分割数], (省略可:通常1)[縦の分割数]);
- getGenerateImageメソッド $image->getGenerateImage((省略可:通常gif)[画像タイプ(jpg/png/gif)]);
- saveGenerateImageメソッド $image->saveGenerateImage((省略可:通常image.gif)[画像ファイル名], (省略可:通常gif)[画像タイプ(jpg/png/gif)]);
- addTextsメソッド $image->addTexts([文字列], [フォントのパス], [文字サイズ], [横の位置(x)], [縦の位置(y), (省略可)[文字色(配列) : array(0,0,0)], (省略可)[UPPER_LEFT,UPPER_RIGHT,CENTER,LEFT_LOWER,RIGHT_LOWER]);
- addColorsメソッド $image->addColors([赤の数値を追加(-255〜255), [緑の数値を追加(-255〜255)], [青の数値を追加(-255〜255)])
- addRedメソッド $image->addRed([赤の数値を追加(-255〜255)]);
- addGreenメソッド $image->addGreen([緑の数値を追加(-255〜255)]);
- addBlueメソッド $image->addBlue([青の数値を追加(-255〜255)]);
- setColorsメソッド $image->setColors([赤の数値を固定(0〜255), [緑の数値を固定(0〜255)], [青の数値を固定(0〜255)])
- setRedメソッド $image->setRed([赤の数値を固定(0〜255)]);
- setGreenメソッド $image->setGreen([緑の数値を固定(0〜255)]);
- setBlueメソッド $image->setBlue([青の数値を固定(0〜255)]);
[PR]Spreeの情報を集めています。
ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/