Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

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

rsky-hatena

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