この時代にPHP5.2の環境を作りたくなって

「今がいつかわかっているのか!2016年だぞ!時代はPHP7だぞ!」
「わかってる…それでも俺には…保守したいシステムがあるんだ!」

という訳で、新サーバーの最新環境で動かせるように古いシステムをブラッシュアップすべく
ひとまずシステムを一通り動かせる環境を作成しようねというお話です。

仕様

  • CakePHP 1.2
  • MySQL 5.1

cakephp1.2は5.3以上だとdeprecatedエラーが沢山出るので5.2の環境を再現したいのでした。
エラー抑制するなどして5.3系でも動かせるんですけどね。cake1.2をPHP5.2以外で作業する場合の参考は以下に詳しいです。
「[PHP][CakePHP] CakePHP1.2 &PHP5.3環境でのDeprecatedエラー表示について」
「PHP 5.3だとCakePHPで大量のエラー」
「http://fdays.blogspot.jp/2009/07/php53-cakephp-deprecated_04.html」

環境を作る

サーバーを立てて、phpとmysqlが動くようになるまでがゴールです。

クラウドの恩恵を受けて気軽にサーバーを立てる

いたずらにサーバー立てたくなったらAmazon Web Serviceというのは誰しも思う事ですね。
まずはAmazon Linuxのminimalでインスタンス立ててyumで色々入れていきます。

httpd httpd-devel gcc libxml2-devel mysql51 mysql51-devel php-mysqlnd mysql51-server mlocate wget

findでもいいんですけどlocateしたいので、ついでにmlocateも入れます。
そして各種ソースのDLのためにwgetも入れます。

PHPはyumから5.2が無理っぽいので手動で導入。ソースはこちらに。
https://secure.php.net/releases/
5.2.17のソースをwget。これ( http://museum.php.net/php5/php-5.2.17.tar.gz )

./configure --prefix=/php-5.2.17 --mandir=/php-5.2.17/share/man --infodir=/php-5.2.17/share/info --with-config-file-path=/php-5.2.17/etc/php5.2 --with-config-file-scan-dir=/php-5.2.17/var/db/php5.2 --with-libdir=/lib64 --enable-dom --enable-json --enable-libxml --enable-mbstring --enable-pdo --enable-session --enable-simplexml --enable-tokenizer --enable-xml --enable-xmlreader --enable-xmlwriter --with-mysqli --with-pdo-mysql --with-mysql --with-libxml-dir=/usr/include --with-pear --with-apxs2=/usr/sbin/apxs

makeで失敗するのでpatchをあてます。patchとか色々必要になり次第yum installしていく姿勢です。

curl -s "https://mail.gnome.org/archives/xml/2012-August/txtbgxGXAvz4N.txt" | patch -p0

patchの内容は以下の通り

--- ext/dom/node.c  2012-08-06 17:49:48.826716692 +0800
+++ ext/dom/node.c  2012-08-06 17:52:47.633484660 +0800
@@ -1895,9 +1895,17 @@ static void dom_canonicalization(INTERNA
         RETVAL_FALSE;
     } else {
        if (mode == 0) {
+#ifdef LIBXML2_NEW_BUFFER
+            ret = xmlOutputBufferGetSize(buf);
+#else
            ret = buf->buffer->use;
+#endif
            if (ret > 0) {
+#ifdef LIBXML2_NEW_BUFFER
+                RETVAL_STRINGL((char *) xmlOutputBufferGetContent(buf), ret, 1);
+#else
                RETVAL_STRINGL((char *) buf->buffer->content, ret, 1);
+#endif
            } else {
                RETVAL_EMPTY_STRING();
            }
--- ext/dom/documenttype.c  2012-08-06 18:02:16.019640870 +0800
+++ ext/dom/documenttype.c  2012-08-06 18:06:16.612228905 +0800
@@ -205,7 +205,13 @@ int dom_documenttype_internal_subset_rea
        if (buff != NULL) {
            xmlNodeDumpOutput (buff, NULL, (xmlNodePtr) intsubset, 0, 0, NULL);
            xmlOutputBufferFlush(buff);
+
+#ifdef LIBXML2_NEW_BUFFER
+           ZVAL_STRINGL(*retval, xmlOutputBufferGetContent(buff),
+                        xmlOutputBufferGetSize(buff), 1);
+#else
            ZVAL_STRINGL(*retval, buff->buffer->content, buff->buffer->use, 1);
+#endif
            (void)xmlOutputBufferClose(buff);
            return SUCCESS;
        }
--- ext/simplexml/simplexml.c   2012-08-06 18:10:44.621017026 +0800
+++ ext/simplexml/simplexml.c   2012-08-06 18:12:48.016270419 +0800
@@ -1417,7 +1417,12 @@ SXE_METHOD(asXML)
 
            xmlNodeDumpOutput(outbuf, (xmlDocPtr) sxe->document->ptr, node, 0, 0, ((xmlDocPtr) sxe->document->ptr)->encoding);
            xmlOutputBufferFlush(outbuf);
+#ifdef LIBXML2_NEW_BUFFER
+           RETVAL_STRINGL((char *)xmlOutputBufferGetContent(outbuf),
+                          xmlOutputBufferGetSize(outbuf), 1);
+#else
            RETVAL_STRINGL((char *)outbuf->buffer->content, outbuf->buffer->use, 1);
+#endif
            xmlOutputBufferClose(outbuf);
        }
    } else {

気を取り直してmake cleanからのconfigure、そしてmake

$ sudo make install
Installing PHP SAPI module:       apache2handler
/usr/lib64/httpd/build/instdso.sh SH_LIBTOOL='/usr/lib64/apr-1/build/libtool' libphp5.la /usr/lib64/httpd/modules
/usr/lib64/apr-1/build/libtool --mode=install cp libphp5.la /usr/lib64/httpd/modules/
libtool: install: cp .libs/libphp5.lai /usr/lib64/httpd/modules/libphp5.la
libtool: install: cp .libs/libphp5.a /usr/lib64/httpd/modules/libphp5.a
libtool: install: chmod 644 /usr/lib64/httpd/modules/libphp5.a
libtool: install: ranlib /usr/lib64/httpd/modules/libphp5.a
libtool: install: warning: remember to run `libtool --finish /var/tmp/php-5.2.17/libs'
Warning!  dlname not found in /usr/lib64/httpd/modules/libphp5.la.
Assuming installing a .so rather than a libtool archive.
chmod 755 /usr/lib64/httpd/modules/libphp5.so
chmod: `/usr/lib64/httpd/modules/libphp5.so' にアクセスできません: そのようなファイルやディレクトリはありません
apxs:Error: Command failed with rc=65536
.
make: *** [install-sapi] エラー 1

libphp5.soが生成されない。
これは最初apxsのDirを指定しないでやった時の一時ファイルが残っているのが原因っぽいので、一度make distcleanしてから再度configureとmakeしたら無事に入りました。

Wrote PEAR system config file at: /php-5.2.17/etc/pear.conf
You may want to add: /php-5.2.17/lib/php to your php.ini include_path
Installing PDO headers:          /php-5.2.17/include/php/ext/pdo/

パスを通しておく

export PATH=$PATH:/php-5.2.17/bin

Apacheの設定

のちに別Verとか入れた時にconf側で利用するphpのlibを変更するとかなったら楽かなって思ってphp5.2用のconfファイルを作ってconf.dに入れてみたのでした。
・/etc/httpd/conf.d/httpd-php52.conf

#
# mime types
#
AddType application/x-httpd-php .php

#
# php5 module for Apache2.2
#
LoadModule php5_module        /usr/lib64/httpd/modules/libphp5.so

#
# php.ini directory
#
PHPIniDir /etc/php.ini

あとVirtualHostのconfもconf.dに
・/etc/httpd/conf.d/vhost.conf

#
# Use name-based virtual hosting.
#
NameVirtualHost *:80

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for requests without a known
# server name.
<VirtualHost *:80>
    DocumentRoot /var/www/furuisystem
    ServerName furuisystem.com
    ErrorLog logs/furuisystem-error_log
    CustomLog logs/furuisystem-access_log common
</VirtualHost>

そしてphp.iniに以下追加。
そういえばこのシステムはDBがUTF8でサーバーがEUC-JPというマルチバイト諸国の悲しみを背負った設定なのでした。

include_path = ".:/php-5.2.17/lib/php"
default_charset = "EUC-JP"

mysql

冒頭のyumですんなり5.1がインストールできたので、以下でスタートして、まずはrootユーザーを作る。
それからプロジェクト用のユーザーを作ったりDBリストアしたりして、問題なく終了。

sudo /etc/rc.d/init.d/mysqld start
/usr/bin/mysqladmin -u root password 'hogehoge'

アクセスできない問題

さーて再起動してアクセスしちゃうぞ!と思いきや、アクセスできない。アクセス系の設定の問題かと思いiptablesして見たところ、特に問題はない。
うーむ何が間違っていたのか…と思っていたら、AWSのセキュリティグループでhttpを許可していなかったのでした。
EC2は江戸城みたいなものなので、内濠(iptables)の設定もさることながら外濠(セキュリティグループ)のこともちゃんと確認しようね。基本中の基本だね。
( http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-network-security.html )

最終的にこうなった

PHP 5.2.17
Mysql 5.1.73

2016年とは思えない環境が無事に完成した。