php_mecab-0.4.0をPHP-5.3.6で動かす方法

php_mecab-0.4.0をPHP-5.3.6で動かすためのパッチ
rskyさん作の、PHPからMeCabを利用するための拡張モジュール*1がとても便利です。
しかし困った事にPHP 5.3.6ではこのphp_mecab-0.4.0のmakeが通りません。
staticがどうのというエラーが起きるので、パッチを作りました。
末尾のコードを「php_mecab-0.4.0.patch」というファイル名で保存して下さい。
あとは以下の要領でパッチを当ててからコンパイル、インストールするのみです。
wget http://www.opendogs.org/pub/php_mecab-0.4.0.tgz tar zxf mecab-0.4.0.tgz patch -d php_mecab-0.4.0 < php_mecab-0.4.0.patch phpize ./configure --with-mecab make make install echo "extension=mecab.so" > /etc/php.d/mecab.ini php -m
このバインディングを使えば、はてなキーワード自動リンク的な物も簡単に実現出来ます。
詳細は、ウノウラボさんの以下記事にて。色々使えて便利なので、是非お試し下さい。
http://labs.unoh.net/2008/01/keyword-autolink-using-php-and-mecab.html
追記
公式に出ていました*2。「OpenDogs PHP extension channel」にて、アップデートされていたようです。
pear-channel化されているので、とても簡単にインストールを行う事が出来ます。PHP-5.3.6で問題なく動きました。
この方法でインストールされるphp_mecab-0.4.1では既に、PHP-5.3.x以上ならstaticを外す処理などが追加されております。
pear channel-discover pecl.opendogs.org pear install opendogs/mecab-beta echo "extension=mecab.so" > /etc/php.d/mecab.ini php -m | fgrep mecab #インストールに成功していたら「mecab」という行が表示されます
php_mecab-0.4.0.patch
*** php_mecab-0.4.0/mecab.c 2008-02-10 16:14:22.000000000 +0900
--- php_mecab-0.4.0/mecab.c 2011-06-22 00:14:00.000000000 +0900
***************
*** 347,365 ****
/* {{{ argument informations */
#ifdef ZEND_BEGIN_ARG_INFO
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab__mecab, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, mecab)
ZEND_END_ARG_INFO()
#ifdef IS_UNICODE
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_set_encoding, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, encoding)
ZEND_END_ARG_INFO()
#endif
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_split, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, str)
ZEND_ARG_INFO(0, dicdir)
--- 347,362 ----
***************
*** 368,426 ****
ZEND_ARG_INFO(0, persistent)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_new, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
ZEND_ARG_ARRAY_INFO(0, arg, 1)
ZEND_ARG_INFO(0, persistent)
ZEND_END_ARG_INFO()
#if PHP_MECAB_VERSION_NUMBER >= 97
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_set_partial, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, mecab)
ZEND_ARG_INFO(0, partial)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_set_partial_m, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
ZEND_ARG_INFO(0, partial)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_set_theta, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, mecab)
ZEND_ARG_INFO(0, theta)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_set_theta_m, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
ZEND_ARG_INFO(0, theta)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_set_lattice_level, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, mecab)
ZEND_ARG_INFO(0, level)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_set_lattice_level_m, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
ZEND_ARG_INFO(0, level)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_set_all_morphs, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, mecab)
ZEND_ARG_INFO(0, all_morphs)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_set_all_morphs_m, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
ZEND_ARG_INFO(0, all_morphs)
ZEND_END_ARG_INFO()
#endif /* MeCab 0.97 or later */
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_sparse_tostr, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 2)
ZEND_ARG_INFO(0, mecab)
ZEND_ARG_INFO(0, str)
--- 365,413 ----
***************
*** 428,454 ****
ZEND_ARG_INFO(0, olen)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_sparse_tostr_m, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, str)
ZEND_ARG_INFO(0, len)
ZEND_ARG_INFO(0, olen)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_sparse_tonode, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 2)
ZEND_ARG_INFO(0, mecab)
ZEND_ARG_INFO(0, str)
ZEND_ARG_INFO(0, len)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_sparse_tonode_m, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, str)
ZEND_ARG_INFO(0, len)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_nbest_sparse_tostr, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 3)
ZEND_ARG_INFO(0, mecab)
ZEND_ARG_INFO(0, n)
--- 415,437 ----
***************
*** 457,463 ****
ZEND_ARG_INFO(0, olen)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_nbest_sparse_tostr_m, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 2)
ZEND_ARG_INFO(0, n)
ZEND_ARG_INFO(0, str)
--- 440,445 ----
***************
*** 465,543 ****
ZEND_ARG_INFO(0, olen)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_nbest_init, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 2)
ZEND_ARG_INFO(0, mecab)
ZEND_ARG_INFO(0, str)
ZEND_ARG_INFO(0, len)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_nbest_init_m, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, str)
ZEND_ARG_INFO(0, len)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_nbest_next_tostr, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, mecab)
ZEND_ARG_INFO(0, olen)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_nbest_next_tostr_m, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
ZEND_ARG_INFO(0, olen)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_format_node, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, mecab)
ZEND_ARG_INFO(0, node)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_format_node_m, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_OBJ_INFO(0, node, MeCab_Node, 0)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_node__node, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, node)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_node_toarray, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, node)
ZEND_ARG_INFO(0, dump_all)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_node_toarray_m, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0)
ZEND_ARG_INFO(0, dump_all)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_node__list, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, node)
ZEND_ARG_INFO(0, index)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_node__list_m, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, index)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_node_settraverse, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, traverse)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab_path__path, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, path)
ZEND_END_ARG_INFO()
- static
ZEND_BEGIN_ARG_INFO_EX(arginfo_mecab__magic_getter, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
ZEND_ARG_INFO(0, name)
ZEND_END_ARG_INFO()
--- 447,511 ----
***************
*** 1673,1684 ****
php_mecab_node *newnode = NULL;
const mecab_node_t *newptr = NULL;
- php_set_error_handling(EH_THROW, ext_ce_InvalidArgumentException TSRMLS_CC);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) == FAILURE) {
- php_std_error_handling();
return;
}
- php_std_error_handling();
intern = (php_mecab_node_object *)zend_object_store_get_object(getThis() TSRMLS_CC);
xnode = intern->ptr;
--- 1641,1649 ----
*1:php_mecabとして配布されています http://d.hatena.ne.jp/rsky/20071228/1198841049
*2:PHPエクステンションのリポジトリ始めました http://d.hatena.ne.jp/rsky/20100620/1277002026