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