PHP5.2.4+MySQL5.6.67+senna(MeCab+tritonn)+Apacheの環境を作成した

PHP5.2.4+MySQL5.6.67+senna(MeCab+tritonn)+Apacheの、とても検索しやすそうな環境を作成する

準備

モジュール導入

sudo yum install wget perl perl-DBI gcc gcc-c++ ncurses-devel

ソース類保存場所に移動

cd /usr/local/src

Mysql

MySQL 5.0.67のdevel,shared,server,client

sudo wget http://downloads.mysql.com/archives/get/file/MySQL-devel-5.0.67-0.glibc23.x86_64.rpm
sudo wget http://downloads.mysql.com/archives/get/file/MySQL-shared-5.0.67-0.glibc23.x86_64.rpm
sudo wget http://downloads.mysql.com/archives/get/file/MySQL-server-5.0.67-0.glibc23.x86_64.rpm
sudo wget http://downloads.mysql.com/archives/get/file/MySQL-client-5.0.67-0.glibc23.x86_64.rpm

依存性等の事を考慮し、rpmではなくyumを使ってlocalinstallしてみる

sudo yum localinstall MySQL-devel-5.0.67-0.glibc23.x86_64.rpm --nogpgcheck
sudo yum localinstall MySQL-shared-5.0.67-0.glibc23.x86_64.rpm --nogpgcheck
sudo yum localinstall MySQL-server-5.0.67-0.glibc23.x86_64.rpm --nogpgcheck
sudo yum localinstall MySQL-client-5.0.67-0.glibc23.x86_64.rpm --nogpgcheck

めかぶ

MeCab 0.991

cd /usr/local/src
sudo wget http://mecab.googlecode.com/files/mecab-0.991.tar.gz
sudo tar xvzf mecab-0.991.tar.gz
cd mecab-0.991
sudo ./configure --prefix=/usr/local/mecab --with-charset=utf8 | sudo tee configure.log.2014-06-27
sudo make 2>&1 | sudo tee make.log.2014-06-27
sudo make install 2>&1 | sudo tee make-install.log.2014-06-27

MeCab ipadic 2.7.0

cd /usr/local/src
sudo wget http://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
sudo tar xvf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
sudo ./configure --prefix=/usr/local/mecab/ipadic --with-mecab-config=/usr/local/mecab/bin/mecab-config --with-charset=utf8 | sudo tee configure.log.2014-06-27
sudo make 2>&1 | sudo tee make.log.2014-06-27
sudo make install 2>&1 | sudo tee make-install.log.2014-06-27

Senna

Senna 1.1.5

cd /usr/local/src
sudo wget http://globalbase.dl.sourceforge.jp/senna/46945/senna-1.1.5.tar.gz
sudo tar xvf senna-1.1.5.tar.gz
cd senna-1.1.5
sudo ./configure --prefix=/usr/local/senna --with-mecab --with-mecab-config=/usr/local/mecab/bin/mecab-config --with-charset=utf8 | sudo tee configure.log.2014-06-27
sudo make 2>&1 | sudo tee make.log.2014-06-27
sudo make install 2>&1 | sudo tee make-install.log.2014-06-27

もしmake中にnfkc.cで止まったら

cd lib
sudo ../libtool --tag=CC --mode=compile \
gcc -I. -I.. -Wall -O0 -fno-strict-aliasing -g -MT nfkc.lo \
-MD -MP -MF .deps/nfkc.Plo -c -o nfkc.lo nfkc.c
# libディレクトリから戻る
cd ../

tritonn

cd /usr/local/src
sudo wget http://globalbase.dl.sourceforge.jp/tritonn/36449/tritonn-1.0.12-mysql-5.0.67.tar.gz
sudo tar xvf tritonn-1.0.12-mysql-5.0.67.tar.gz
cd tritonn-1.0.12-mysql-5.0.67
sudo ./configure --prefix=/usr/local/mysql_senna --enable-thread-safe-client --with-charset=utf8 --with-extra-charsets=all --with-readline --with-mecab=/usr/local/mecab --with-senna=/usr/local/senna | sudo tee configure.log.2014-06-27
sudo make 2>&1 | sudo tee make.log.2014-06-27
sudo make install 2>&1 | sudo tee make-install.log.2014-06-27

my.cnf作成
client、mysqldのsocketを変更する

sudo cp support-files/my-medium.cnf /etc/my.cnf
sudo vi /etc/my.cnf
my.cnf
[client]
#password       = your_password
port            = 3306
socket          = /var/lib/mysql/mysql.sock

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port            = 3306
socket          = /var/lib/mysql/mysql.sock

install dbを実行する

sudo /usr/local/mysql_senna/bin/mysql_install_db --user=mysql --skip-name-resolve

自動起動設定

cd /usr/local/src/tritonn-1.0.12-mysql-5.0.67/support-files/
sudo cp -p mysql.server mysql
sudo chmod +x mysql
sudo mv mysql /etc/init.d/
cd /etc/rc2.d/
sudo ln -s ../init.d/mysql S90mysql
#一応onになっているか確認
chkconfig | grep mysql
sudo service mysql start

この際もし

Starting MySQL.. ERROR! Manager of pid-file quit without updating file.

という旨のエラーが出ていたら、以下のコマンドでmysqlが稼働していないか確認し、稼働中であればMySQLプロセスをkillする

ps ax | grep mysql
#あればkill
sudo kill [プロセス番号]

Apache

sudo yum install httpd httpd-devel libxml2 libxml2-devel
sudo chkconfig httpd on
#一応onになっているか確認
chkconfig | grep httpd

PHP

sudo wget http://museum.php.net/php5/php-5.2.4.tar.gz
sudo tar xvf php-5.2.4.tar.gz
cd php-5.2.4
sudo ./configure --with-apxs2=/usr/sbin/apxs --with-iconv --enable-mbstring --with-mysql=/usr/local/mysql_senna/bin/mysql_config --with-mysqli=/usr/local/mysql_senna/bin/mysql_config --with-libxml-dir=/usr/include/libxml2 --with-libdir=lib64

このままmakeを行うとエラーが出るので、libxml2のバージョンに準拠した表記に変更する

ext/dom/node.c

(略)
if (buf == NULL || ret < 0) {
        RETVAL_FALSE;
    } else {
                if (mode == 0) {
                        ret = xmlOutputBufferGetSize(buf);
                        if (ret > 0) {
                        ####ここ
                        RETVAL_STRINGL((char *) xmlOutputBufferGetContent(buf), ret, 1);
                        } else {
                                RETVAL_EMPTY_STRING();
                        }
                }
    }
(略)

ext/dom/documenttype.c

(略)
if (dtdptr->doc != NULL && ((intsubset = dtdptr->doc->intSubset) != NULL)) {
                buff = xmlAllocOutputBuffer(NULL);
                if (buff != NULL) {
                        xmlNodeDumpOutput (buff, NULL, (xmlNodePtr) intsubset, 0, 0, NULL);
                        xmlOutputBufferFlush(buff);
                        ####ここ   
                        strintsubset = xmlStrndup(xmlOutputBufferGetContent(buff), xmlOutputBufferGetSize(buff));
                        (void)xmlOutputBufferClose(buff);
                        ZVAL_STRING(*retval, (char *) strintsubset, 1);
                        return SUCCESS;
                }
        }
(略)

ext/simplexml/simplexml.c

(略)
        if (node) {
                if (node->parent && (XML_DOCUMENT_NODE == node->parent->type)) {
                        xmlDocDumpMemory((xmlDocPtr) sxe->document->ptr, &strval, &strval_len);
                        RETVAL_STRINGL((char *)strval, strval_len, 1);
                        xmlFree(strval);
                } else {
                        /* Should we be passing encoding information instead of NULL? */
                        outbuf = xmlAllocOutputBuffer(NULL);

                        if (outbuf == NULL) {
                                RETURN_FALSE;
                        }

                        xmlNodeDumpOutput(outbuf, (xmlDocPtr) sxe->document->ptr, node, 0, 0, ((xmlDocPtr) sxe->document->ptr)->encoding);
                        xmlOutputBufferFlush(outbuf);
                        ####ここ
                        RETVAL_STRINGL((char *)xmlOutputBufferGetContent(outbuf),xmlOutputBufferGetSize(outbuf), 1);
                        xmlOutputBufferClose(outbuf);
                }       
        } else {
                RETVAL_FALSE;
        }
(略)

変更したらmake & make install

sudo make 2>&1 | sudo tee make.log.2014-06-27
sudo make install 2>&1 | sudo tee make-install.log.2014-06-27

php.iniファイルを作成

sudo cp php.ini-recommended /usr/local/lib/php.ini

Apacheの設定

sudo vi /etc/httpd/conf/httpd.conf

“libphp5.so”あたりで検索を行い、モジュールを読み込んでいる部分が追加されているか確認
そしてHandlerを追加し、.php拡張子のファイルに対してsethandler
(設定はおこのみで)

/etc/httpd/conf/httpd.conf
(略)
LoadModule php5_module        /usr/lib64/httpd/modules/libphp5.so
(略)
#以下追記
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>
(略)

httpdを起動する(既に一度起動していればrestartでよい)

sudo service httpd start

MySQLのテスト

create database senna_test default character set=utf8;
use senna_test;
create table table01 (id int unsigned auto_increment not null, primary key(id), title varchar(255), body text, fulltext(body)) type=MyISAM;
insert into table01 values(null,"テストです","オレンジはorange、リンゴはappleです");
SELECT * FROM table01 WHERE MATCH(body) AGAINST('リンゴ');

これでinsertしたデータが出て来るはず!

MySQL+PHPとの連携を確認

MySQLのテストで作ったDBにphpから接続できるかを確認

<?php

$mysql = mysql_connect('127.0.0.1','root','');
if (!$mysql) {
    die('failed! '.mysql_error());
}

$test = mysql_select_db('senna_test', $mysql);
if(!$test) {
        die('failed!'.mysql_error());
}

$result = mysql_query("SELECT * FROM table01 WHERE MATCH(body) AGAINST('apple')");
if(!$result) {
        die('failed!'.mysql_error());
} else {
        var_dump(mysql_fetch_assoc($result));
}

mysql_close($mysql);

文字コードとか気をつければ表示される。はず!