てきとう

ワーワーゆうとります

PHP5.2と5.3を共存させるまでの道のり

前提

・CentOS5.3でApache2.3.3(たしか)
・元々PHP 5.2.13が入っている
・そこにPHP5.3.3もご一緒したい
・5.2はApache Handlerで、5.3はfastCGI
・バーチャルホストで動かしているmoge.com内は5.2で、hoge.comは5.3で動かしていこうと思う


やっていこう
なんかすごくエラーがたくさん出て困ったけど、なんとかインストールできた。やっぱり困ったらgoogle先生と相談して頑張るのが一番。
時にはしくじる事もある、ちょっぴり悲しい事もある、だけど、なんとかなる。
今回本当に好き…と思ったサイトは
Multiple PHP versions on one webserver
http://blog.dynom.nl/archives/Multiple-PHP-versions-on-one-webserver_20091103_53.html
FastCGI+Apache インストールメモ
http://www.softel.co.jp/blogs/tech/archives/2100
の2ヶ所でございます。本当にありがとうございました。
そうそうfastCGIのインストールもしたんだけど、そのへんは参考サイトさんが既に完璧だから書きません。


1. PHP5.3.3をインストール
最終的に使ったconfigureのオプションはこれ。cgiとして使う場合は「-with-apxs2」を入れないように気をつけましょう。
これ入れてconfigureするとphp-cgiができないみたいです。ハマりどころですな。

./configure \
--prefix=/php-5.3.3 \    //ここはPHP5.3を入れたい場所
--mandir=/php-5.3.3/share/man \    //このへんもよきに計らう
--infodir=/php-5.3.3/share/info \    //このへんもよきに計らう
--with-config-file-path=/php-5.3.3/etc/php5 \    //config fileのパス。多分後からphp.iniで直せる
--with-config-file-scan-dir=/php-5.3.3/var/db/php5 \    //config_file_scan_dirのパス。多分後からphp.iniで直せる
--enable-bcmath \
--enable-ctype \
--enable-dom \
--enable-filter \
--enable-hash \
--enable-json \
--enable-libxml \
--enable-mbstring \
--enable-pdo \
--enable-session \
--enable-simplexml \
--enable-tokenizer \
--enable-xml \
--enable-xmlreader \
--enable-xmlwriter \
--with-bz2=/usr/include \
--with-gd=/usr/include \
--with-mcrypt=/usr/include \
--with-mhash=/usr/include \
--with-mysql=/usr/bin/mysql \
--with-pcre-regex=/usr/local \
--with-readline=/usr/include \
--with-libxml-dir=/usr/include \
--with-zlib=/usr/local \
--with-ldap=/usr \
--with-iconv=/usr/local \ ※エラー出たから追加した
--with-freetype-dir=/usr/include/freetype2/freetype \
--with-pdo-mysql=/usr/bin/mysql ※ここも色々エラーが出た。mysqlの場所とかはwhichしたりfindしたりそれぞれ頑張るように
  • 途中出たエラー

・エラーその1「libiconvがない」
☆解決策…libiconvを入れてリンクパスを通す

# mkdir -p /usr/local/src/libiconv
# cd /usr/local/src/libiconv
# wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.10.tar.gz  //貰ってくる場所やバージョンはお好みで
# wget http://www2d.biglobe.ne.jp/~msyk/software/libiconv/libiconv-1.10-ja-1.patch.gz //色々あってパッチを当ててます
# tar xzf libiconv-1.10.tar.gz
# cd libiconv-1.10
# gzip -dc ../libiconv-1.10-ja-1.patch.gz | patch -p1
# ./configure
# make
# make install
# echo 'include /usr/local/lib/liconv.so' >> /etc/ld.so.conf
# /sbin/ldconfig

で、--with-iconv=/usr/localを追加した次第


・エラーその2 「/usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status」
☆解決策…lltdlがありませんよ、みたいに言われたが、そんなはずはないのでとりあえず探す。

# find / -name 'libltdl'

ってやって探して出てきた場所に移動し、とりあえずconfigureしてmakeしてみる

# cd /usr/share/libtool/libltdl
# ./configure --enable-ltdl-install
# make
# make install

いたけど入ってなかったって事?よくわからないけど無事入った。


2. PHP5.3.3が入ったら
色々とエラーを解消しつつ、無事PHP5.3.3が入ったら

Wrote PEAR system config file at: /php-5.3.3/etc/pear.conf
You may want to add: /php-5.3.3/lib/php to your php.ini include_path
/root/php-5.3.3/build/shtool install -c ext/phar/phar.phar /php-5.3.3/bin
ln -s -f /php-5.3.3/bin/phar.phar /php-5.3.3/bin/phar
Installing PDO headers:          /php-5.3.3/include/php/ext/pdo/

っていうメッセージが出てたのでメッセージに従う

  • php.iniに追加

php.iniのinclude_pathに/php-5.3.3/lib/php追加

include_path = ".:/php/includes:/php-5.3.3/lib/php"
# /root/php-5.3.3/build/shtool install -c ext/phar/phar.phar /php-5.3.3/bin
# ln -s -f /php-5.3.3/bin/phar.phar /php-5.3.3/bin/phar
FcgidInitialEnv PHPRC "/php-5.3.3/lib/"

を追加
そしてhoge.comのvirtualhost内にいくつか足す

<VirtualHost *:80>
    DocumentRoot "/var/www/hoge"
    ServerName hoge.com
    AddType text/html .php
    DirectoryIndex index.php index.html
    AddHandler fcgid-script .php      #ここと
    FcgidWrapper "/php-5.3.3/bin/php-cgi" .php #ここを足した
    <Directory "/var/www/hoge">
        Options -Indexes FollowSymLinks ExecCGI #CGIが実行できるようにしておく
        AllowOverride all
        Order allow,deny
        Allow from all
    </Directory>
</virtualHost>

を追記。5.2の方はAddHandlerしてるphpで動いているのでそのへんは何もしなくていいはず。そしたら

mod_fcgid: can't apply process slot for /php-5.3.3/bin/php-cgi

とエラーが。色々調べて

# chmod 755 /var/log/httpd/

ってやったら動いた


3. 追加した方のPHPpeclでライブラリとか入れていく

# /php-5.3.3/bin/pecl install imagick

って感じで、新しいPHPを追加した場所のpeclを使うのを忘れずにね!
普通に

# pecl install imagick

とかやっても元々入ってたPHPに入っていくばかりです。pearもね。
無事入ったら5.3の方のphp.ini内でextension=imagick.soを追加するよ。
場所がわからなかったらphpinfoで読み込んでいるphp.iniを確認しよう。
extension_dirとか大概のものが確認できる。便利だ。
php.iniの変更自体はできてるのに、追加したextensionだけはなぜかphpinfoで出てこないよっていう時は大抵入ってないよ
findで見つけたimagick.soをphp5.3のextension_dir内にコピーして読み込んで「動かねぇ!」とかやってたけど
よく考えたらpeclPHPごとにあるんだよねって事でインストールしたら動きましたよ。
入っているかどうかをコマンドラインからお手軽に確認したい時は

/php-5.3.3/bin/php -i |grep imagick

とかで確認してみようね。


【おまけ】 pcreが入ってるのに「Compilation failed: this version of PCRE is not compiled with PCRE_UTF8 support」
phpinfoで確認したらpcreはenabled。そうです入ってる事は入ってるんです。
でもPCREがUTF-8をサポートしてないよーっていうことで確認

# pcretest -C
PCRE version 8.20 2011-10-21
Compiled with
  No UTF-8 support
  No Unicode properties support
  No just-in-time compiler support
  Newline sequence is LF
  \R matches all Unicode newlines
  Internal link size = 2
  POSIX malloc threshold = 10
  Default match limit = 10000000
  Default recursion depth limit = 10000000
  Match recursion uses stack

UTF-8をサポートしていないですね。
という訳でpcre-8.20は手動で入れてあったので、再インストールします

# cd pcre-8.20
# ./configure --enable-utf8
# make
# make install

これでもう一度確認

]# pcretest -C
PCRE version 8.20 2011-10-21
Compiled with
  UTF-8 support
  No Unicode properties support
  No just-in-time compiler support
  Newline sequence is LF
  \R matches all Unicode newlines
  Internal link size = 2
  POSIX malloc threshold = 10
  Default match limit = 10000000
  Default recursion depth limit = 10000000
  Match recursion uses stack

入りました。pcreが動きましたね。ところでPCREって「Perl Compatible Regular Expressions」の略なんですけど
パっと見なんか「PreCuRE」って感じに見えるんですよね。不思議ですね。今週は黄瀬やよいさんのじゃんけんに勝ちました。