MongoDBをphpから操作する方法。

前回の記事でMongoDBをインストールしましたので、MongoDBをphpから操作してみました。
CentOS5.4にMongoDBをインストールする方法! - @camelmasaの開発日記


testデータベース&testコレクションの作成

testデータベース&testコレクションの作成には下記のスクリプトを使用しました。
(Mongoクラスのコンストラクタは適切な値を設定して下さい。)

<?php

$mongo = new Mongo("192.168.80.139:27017");

$db = $mongo->selectDB("test");
$col = $db->createCollection("test");
$col->insert(array("test" => "test"));

スクリプトを実行すると、/data/db内にデータベースファイルが作成されます。

-rwxr-xr-x 1 root root         5  2月 22 15:14 mongod.lock
-rw------- 1 root root  67108864  2月 21 21:52 test.0
-rw------- 1 root root 134217728  2月 21 21:52 test.1
-rw------- 1 root root  16777216  2月 21 21:52 test.ns

SQLiteの様にデータベースの持ち運びも楽そうですね。
(しかしファイルサイズが大きいかも…)


PECLパッケージPECL::Package::mongoのインストール

phpから操作する為にPECL::Package::mongoをインストールします。

pecl install mongo

その後php.iniにextension=mongo.soを追加します。

extension=mongo.so

これでPECLパッケージPECL::Package::mongoのインストールが出来ました。
(ブラウザからphpを実行する場合は、httpデーモンをリスタートすると有効になります。)


phpからMongoDBを操作

PECLパッケージPECL::Package::mongoがインストール&設定が出来たので、


mongodb.phpの編集

<?php

$mongo = new Mongo();

$db = $mongo->selectDB("test");
$col = $db->selectCollection("test");
$cursor = $col->findOne();

var_dump($cursor);

上記のphpの実行結果です。

php mongodb.php
array(2) {
  ["_id"]=>
  object(MongoId)#6 (0) {
  }
  ["test"]=>
  string(4) "test"
}

phpからMongoDBのtestデータベース内のtestコレクションのデータを取得する事が出来ました!


まとめ

PPECLパッケージPECL::Package::mongoでMongoDBの値の取得を行う事が出来ました。
次こそはCouchDB,MongoDB,MySQLphpで実行した実行速度を計測してみたいと思います。


[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/

CouchDBをphpから操作する方法。

前回の記事でCouchDBをインストールしましたので、CouchDBphpから操作してみました。
CentOS5.4にCouchDBをインストールする方法! - @camelmasaの開発日記


testデータベース&testフィールドの作成

管理画面(_utils)の左上に表示されている"Create Database"リンクを押してデータベースを作成する事が出来ます。

画面の指示に従ってフィールド名も入力すると下記の画面が表示されました。

これでtestデータベース&testフィールドが作成出来ました。簡単ですね。


PECLパッケージphp_couchdbのインストール

phpから操作する為にcouchdb.soという野良PECLパッケージがあったので使用してみました。
Topdog.za.net :: PHP CouchDB Extension


…しかし下記のエラーが表示されてしまい、PHPでエラーになってしまいます。

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/modules/couchdb.so' - /usr/lib/php/modules/couchdb.so: undefined symbol: php_json_encode in Unknown on line 0

vim /usr/include/php/ext/json/php_json.h

*
  +----------------------------------------------------------------------+
  | PHP Version 5                                                        |
  +----------------------------------------------------------------------+
  | Copyright (c) 1997-2009 The PHP Group                                |
  +----------------------------------------------------------------------+
  | This source file is subject to version 3.01 of the PHP license,      |
  | that is bundled with this package in the file LICENSE, and is        |
  | available through the world-wide-web at the following url:           |
  | http://www.php.net/license/3_01.txt                                  |
  | If you did not receive a copy of the PHP license and are unable to   |
  | obtain it through the world-wide-web, please send a note to          |
  | license@php.net so we can mail you a copy immediately.               |
  +----------------------------------------------------------------------+
  | Author: Omar Kilani <omar@php.net>                                   |
  +----------------------------------------------------------------------+
*/

/* $Id: php_json.h 283185 2009-06-30 17:52:21Z stas $ */

#ifndef PHP_JSON_H
#define PHP_JSON_H

#define PHP_JSON_VERSION "1.2.1"
#include "ext/standard/php_smart_str.h"

extern zend_module_entry json_module_entry;
#define phpext_json_ptr &json_module_entry

#if defined(PHP_WIN32) && defined(JSON_EXPORTS)
#define PHP_JSON_API __declspec(dllexport)
#else
#define PHP_JSON_API PHPAPI
#endif

#ifdef ZTS
#include "TSRM.h"
#endif

ZEND_BEGIN_MODULE_GLOBALS(json)
        int error_code;
ZEND_END_MODULE_GLOBALS(json)

#ifdef ZTS
# define JSON_G(v) TSRMG(json_globals_id, zend_json_globals *, v)
#else
# define JSON_G(v) (json_globals.v)
#endif

PHP_JSON_API void php_json_encode(smart_str *buf, zval *val, int options TSRMLS_DC);
PHP_JSON_API void php_json_decode(zval *return_value, char *str, int str_len, zend_bool assoc, long depth TSRMLS_DC);

#endif  /* PHP_JSON_H */

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim600: noet sw=4 ts=4 fdm=marker
 * vim<600: noet sw=4 ts=4
 */


…うーん。エラーの原因がわからない。
alpha版なので、もっと作りこんでほしいなあと思う。
MongoDBの場合はPECL::MONGOがあってPHPer歓喜なんだけども。
別の方法でCouchDBにアクセスしてみる事にします。


PEARパッケージHTTP_Requestのインストール

CouchDBはHTTPリクエストでデータが取得出来るので、PEARパッケージHTTP_Requestをインストールして実行する事にしました。

pear install HTTP_Request

couchdb.phpの編集

<?php

require_once "HTTP/Request.php";

$http = new HTTP_Request('http://192.168.80.139:5984/test/93e4b62c166489b5ff94600e3003db88');
$response = $http->sendRequest();

var_dump($http->getResponseBody());

上記のphpの実行結果です。

php couchdb.php

string(101) "{"_id":"93e4b62c166489b5ff94600e3003db88","_rev":"2-f62fade7a96a75f5bb109036ad107af0","test":"test"}
"

phpからCouchDBのtestデータベース内のtestフィールドのデータを取得する事が出来ました!


まとめ

PEAR::HTTP_RequestでCouchDBの値の取得を行う事が出来ました。
他に方法を知っている方がいらっしゃいましたら情報くださ〜い!


[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/

Q4MをCentOS5.4にインストールしphpで実行しました。

Q4Mid:kazuhookuさんが開発したMySQLでメッセージキューを実装するストレージエンジンです。
思わぬ機会でQ4Mに触れる事が出来たので実際に構築〜phpでの実行を記事にしました。

環境

OS:CentOS5.4
MySQL:5.1.43-1
Q4M:q4m-0.9
PHP:5.1.6


インストール

インストールには下記の記事を参考にしました。
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のZip関数をインストールしました。

仕事でphpのZip関数をインストールしたのでメモ。

Zip関数のインストール方法
http://php.benscom.com/manual/ja/zip.installation.php

方法が2つあるみたいです。
phpをソースからインストールする時に、zipサポートを有効にしてPHPコンパイルする方法
PECL経由でのインストール方法

仕事では②の方法でインストールしました。


まず、PEARの不具合を修正します。
http://d.hatena.ne.jp/snegishi/20071212/1197422664

修正後、php.iniのmemory_limitの値を32Mもしくは64Mに設定します。
その後、下記のpeclコマンドにてZip関数をインストールします。

pecl install zip

Zip関数をインストール後、phpから利用する為に、
php.iniにextension=zip.soを追加しapacheを再起動して
インストールが完了しました。



[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/