Proong

GroongaのPHPライブラリを作っています。
https://github.com/Yujiro3/proonga

インストール
Groongaライブラリ

$ sudo aptitude install -y libgroonga0 libgroonga-dev
Groonga v4.0.7で追加されたC-APIを利用しています。
最新版のライブラリを利用してください。

proongaのインストール

$ git clone https://github.com/Yujiro3/proonga.git
$ cd ./proonga
$ phpize
$ ./configure
$ make
$ sudo -s
# make install
# cd /etc/php5/mods-available
# echo extension=groonga.so > proonga.ini
# cd /etc/php5/conf.d
# ln -s ../mods-available/proonga.ini ./30-proonga.ini

php_json_encode_exを利用してます。
php5-jsonを有効にしてください。
CentOSなどでは、php-commonに含まれているので
proonga.iniの読み込みタイミングに気をつけてください。

phpの下位互換用の分岐を書いていません。
php5.3.x以上で動くと思いますが、PHP 5.5.18で開発しています。

クラス一覧
Groongaクラス
GCommandクラス
GTableクラス
GColumnクラス
GLoadクラス
GDeleteクラス
GSelectクラス

サンプル
micro_blog.php https://gist.github.com/Yujiro3/1ce4908b191cfaf77b5d
コード

/* select --table Users --match_columns name,location_str,description --query "New York" --output_columns _key,name */
$result = $gdb->table('Users')
    ->select()
    ->matchColumns('name,location_str,description')
    ->query('"New York"')
    ->outputColumns('_key,name')
    ->exec(true);

echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_BIGINT_AS_STRING);

結果

[
    [
        [
            1
        ],
        [
            [
                "_key",
                "ShortText"
            ],
            [
                "name",
                "ShortText"
            ]
        ],
        [
            "bob",
            "Bob"
        ]
    ]
]

Groongaの組み込みコマンドを実行するクラス群です。
極力ソースを書かないように心がけたのでバグも少ないはずです。

CentOSでzend_call_method_with_*_params()関数がうまく動かなかったので
MongoDBのバインディングとかが使っている方法を試してみました。
とりあえず問題ないようです。

Groongaの組み込みコマンドが楽ちん過ぎて普通書き方に戻れない。。。

お役立ちリンク
Groonga Cライブラリを使う上で知っておいてほしいこと

Groonga関連のドキュメント

Groonga組み込みコマンドの利用

Websocketなどの持続接続型サーバ

Exchangerとは
Websocketなど接続が持続する処理にFasctCGIを利用して処理できるサーバです。

[github:exchanger]
exchanger

Exchangerフロー
001
接続処理はExchangerサーバが処理し、アプリケーション処理はFastCGI(php5-fpm)で行います。

002


チャットアプリ

・8888ポートの待受をexchangerサーバ
・アプリケーション処理をphp5-fpm
・ブラウザ側処理はjavascript


感想
私は、PHPerと思います。
ExchangerはC++で作成しました。
C言語をまともに使ったのも5年ぶりぐらい、C++はVC以来なので10年以上ぶり
C++の書き方が合っているのか、。。。ではあります。

fluentdをPHPでも作ってしまえと思いphp5-tailを作ったときにモジュールを調べました。
その時にlibeventにヒットしました。
phpからもlibeventは簡単に使えて、websocketサーバなども作ってみました。
その時に、phpをサーバとして使ってよいものか?
下手にCで作るよりはphpに任せたほうがまともに動くだろうとは思います。

私は、PHPが好きなんです。
リアルタイム処理をnode.jsに全部持っていかれるのが嫌なのです。
PHPでテンプレートエンジンを使うバカが大っ嫌いなのです。

nginxなどから直接、FastCGIでwebsocketが使えないのかな?
調べた限り納得できるものがなかったので作ってみたという感じです。

幸いlibeventがあまりにも手軽なため、C++で作ることができました。

Exchangerは、FastCGIをアプリケーション処理に使います。
ExchangerとFastCGIの共有リソースとしてRedisを使います。

自分の好きな言語でリアルタイム処理のアプリケーションが作れるようになると思います。


ToDo
・SSL/TLS処理の実装(テストなどがまだ)
・セキュリティ強化
・再接続関連
・サンプルアプリ(node.jsから移植)

./configure実行時のエラー

コンパイル時のライブラリ認識エラー

phpize
./configure

configure: error: wrong "***" lib version or lib not found

ライブラリ一覧に存在するか確認

$ ldconfig -p | grep "***"

インストールしたはずのライブラリ名を検索してなかったら
ライブラリリストを更新させます。

ライブラリリストの更新

sudo ldconfig
ldconfig -p |grep libevent
        libevent_pthreads-2.0.so.5 (libc6,x86-64) => /usr/local/lib/libevent_pthreads-2.0.so.5
        libevent_pthreads-2.0.so.5 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libevent_pthreads-2.0.so.5
        libevent_openssl-2.0.so.5 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libevent_openssl-2.0.so.5
        libevent_extra-2.0.so.5 (libc6,x86-64) => /usr/local/lib/libevent_extra-2.0.so.5
        libevent_extra-2.0.so.5 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libevent_extra-2.0.so.5
        libevent_core-2.0.so.5 (libc6,x86-64) => /usr/local/lib/libevent_core-2.0.so.5
        libevent_core-2.0.so.5 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libevent_core-2.0.so.5
        libevent-2.0.so.5 (libc6,x86-64) => /usr/local/lib/libevent-2.0.so.5
        libevent-2.0.so.5 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libevent-2.0.so.5

Websocketなどの持続接続型サーバ

Exchangerとは
Websocketなど接続が持続する処理にFasctCGIを利用して処理できるサーバです。

[github:exchanger]
exchanger

Exchangerフロー
001
接続処理はExchangerサーバが処理し、アプリケーション処理はFastCGI(php5-fpm)で行います。

002


チャットアプリ

・8888ポートの待受をexchangerサーバ
・アプリケーション処理をphp5-fpm
・ブラウザ側処理はjavascript


感想
私は、PHPerと思います。
ExchangerはC++で作成しました。
C言語をまともに使ったのも5年ぶりぐらい、C++はVC以来なので10年以上ぶり
C++の書き方が合っているのか、。。。ではあります。

fluentdをPHPでも作ってしまえと思いphp5-tailを作ったときにモジュールを調べました。
その時にlibeventにヒットしました。
phpからもlibeventは簡単に使えて、websocketサーバなども作ってみました。
その時に、phpをサーバとして使ってよいものか?
下手にCで作るよりはphpに任せたほうがまともに動くだろうとは思います。

私は、PHPが好きなんです。
リアルタイム処理をnode.jsに全部持っていかれるのが嫌なのです。
PHPでテンプレートエンジンを使うバカが大っ嫌いなのです。

nginxなどから直接、FastCGIでwebsocketが使えないのかな?
調べた限り納得できるものがなかったので作ってみたという感じです。

幸いlibeventがあまりにも手軽なため、C++で作ることができました。

Exchangerは、FastCGIをアプリケーション処理に使います。
ExchangerとFastCGIの共有リソースとしてRedisを使います。

自分の好きな言語でリアルタイム処理のアプリケーションが作れるようになると思います。


ToDo
・SSL/TLS処理の実装(テストなどがまだ)
・セキュリティ強化
・再接続関連
・サンプルアプリ(node.jsから移植)