====== CentOS6 に PHP 5.1.6 をインストールする ====== 以下の内容は、CentOS 6.3 に PHP 5.3.18 (Remiリポジトリ) と MySQL 5.5.28 (Remiリポジトリ) がインストールされた環境に、PHP 5.1.6 を混在させる方法です。\\ \\ ===== PHP の古いバージョンを探す =====  古いバージョンは[[http://php.net/releases/index.php|Unsupported Historical Releases]]より探すことができる。\\ ===== 少し古い OpenSSL をソースからインストール ===== CentOS 6.3 の OpenSSL が 1.0.0 なので、[[https://bugs.php.net/bug.php?id=53547|Bug #53547 Cannot compile PHP with OpenSSL]] のバグで PHP をビルドできないようである。\\ $ rpm -qa | grep openssl openssl-1.0.0-25.el6_3.1.x86_64 openssl-devel-1.0.0-25.el6_3.1.x86_64 バグを回避する為に、少し古い OpenSSL をソースからインストールする。\\ - OpenSSL 0.9.8 のソースをダウンロードする。 $ cd ~/work $ curl -O http://www.openssl.org/source/openssl-0.9.8x.tar.gz ※openssl-0.9.8e.tar.gz だと x86_64 でバグでビルドできない。\\ [[http://rt.openssl.org/Ticket/Display.html?id=2094&user=guest&pass=guest|#2094: BUG: 0.9.8x md5-x86_64.s:41: Error: 0xd76aa478 out range of signed 32bit displacement]] - ダウンロードした圧縮ファイルを解凍する。 $ tar zxvf openssl-0.9.8x.tar.gz - configure する。(openssl は ./config) $ cd openssl-0.9.8x $ ./config --prefix=/usr/local shared - ビルドしてインストールする。 $ make $ sudo make install LIBDIR=lib64 ※本家の tar ball は x86_64 でも /usr/local/lib にインストールされるので、/usr/local/lib64に配置するように LIBDIR=lib64 を指定する。 ===== PHP をソースからインストール ===== - ソースをダウンロードする。 $ cd work $ curl -O http://museum.php.net/php5/php-5.1.6.tar.bz2 - ダウンロードした圧縮ファイルを解凍する。 $ tar jxvf php-5.1.6.tar.bz2 - ビルドに必要なパッケージをインストールする。 $ sudo yum install zlib-devel openssl-devel db4-devel pcre-devel $ sudo yum install libicu libicu-devel gettext-devel gd-devel $ sudo yum install readline-devel libxml2-devel libxslt-devel $ sudo yum install libcurl-devel $ sudo yum install mysql-devel postgresql-devel --enablerepo=remi - configure する。 $ cd php-5.1.6 $ ./configure \ --prefix=/usr/local/lib64/php-5.1.6 \ --with-config-file-path=/usr/local/lib64/php-5.1.6 \ --enable-cli \ --with-libdir=lib64 \ --enable-mbstring=shared \ --enable-intl=shared \ --with-icu-dir=shared \ --with-gettext=shared \ --with-pcre-regex=shared \ --with-pcre-dir=shared \ --with-readline=shared \ --with-libxml-dir=/usr/bin/xml2-config \ --enable-soap \ --enable-wddx \ --with-xmlrpc \ --with-xsl=shared \ --enable-force-cgi-redirect \ --enable-mbstr-enc-trans \ --enable-track-vars \ --enable-mbregex \ --with-gd=shared \ --with-jpeg-dir=/usr/include \ --with-png-dir=/usr/include \ --enable-gd-native-ttf \ --with-openssl=/usr/local \ --with-zlib=shared \ --with-curl=shared \ --enable-ftp=shared \ --with-mysql=shared \ --with-mysqli=shared \ --with-pdo-mysql=shared \ --with-pdo-sqlite=shared \ --with-pgsql=shared \ --enable-sqlite-utf8 \ --enable-zend-multibyte \ --program-suffix=51 \ 2>&1 | tee configure_log.txt ※configure のオプション一覧は ./configure --help で確認できる。 - curl の interface.c がエラーになるので修正する。\\ 以下の2つの行をコメントアウトする。\\ REGISTER_CURL_CONSTANT(CURLOPT_FTPASCII); \\ REGISTER_CURL_CONSTANT(CURLOPT_PASSWDFUNCTION); $ cp ext/curl/interface.c ext/curl/interface.c.org $ vi ext/curl/interface.c $ diff ext/curl/interface.c ext/curl/interface.c.org 274c274 < //REGISTER_CURL_CONSTANT(CURLOPT_FTPASCII); --- > REGISTER_CURL_CONSTANT(CURLOPT_FTPASCII); 314c314 < //REGISTER_CURL_CONSTANT(CURLOPT_PASSWDFUNCTION); --- > REGISTER_CURL_CONSTANT(CURLOPT_PASSWDFUNCTION); - mysqli の mysqli.c がエラーになるので、mysql.h を修正する。 enum mysql_protocol_type { MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET, MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY }; typedef struct character_set { unsigned int number; /* character set number */ unsigned int state; /* character set state */ const char *csname; /* collation name */ const char *name; /* character set name */ の間に /* There are three types of queries - the ones that have to go to the master, the ones that go to a slave, and the adminstrative type which must happen on the pivot connectioin */ enum mysql_rpl_type { MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE, MYSQL_RPL_ADMIN }; を挿入する。 $ sudo cp /usr/include/mysql/mysql.h /usr/include/mysql/mysql.h.org $ sudo vi /usr/include/mysql/mysql.h $ diff /usr/include/mysql/mysql.h /usr/include/mysql/mysql.h.org 227,236d226 < /* < There are three types of queries - the ones that have to go to < the master, the ones that go to a slave, and the adminstrative < type which must happen on the pivot connectioin < */ < enum mysql_rpl_type < { < MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE, MYSQL_RPL_ADMIN < }; < - mysqli の mysqli_api.c がエラーになるので修正する。\\ 145行目以降4カ所: bind[ofs].buffer = (gptr)&Z_DVAL_PP(args[i]); bind[ofs].buffer = &Z_DVAL_PP(args[i]); ※(gptr)にキャストしている部分をすべて除去する。 $ cp ext/mysqli/mysqli_api.c ext/mysqli/mysqli_api.c.org $ vi ext/mysqli/mysqli_api.c $ diff ext/mysqli/mysqli_api.c ext/mysqli/mysqli_api.c.org 145c145 < bind[ofs].buffer = &Z_DVAL_PP(args[i]); --- > bind[ofs].buffer = (gptr)&Z_DVAL_PP(args[i]); 151c151 < bind[ofs].buffer = &Z_LVAL_PP(args[i]); --- > bind[ofs].buffer = (gptr)&Z_LVAL_PP(args[i]); 601c601 < stmt->stmt->params[i].buffer = &Z_LVAL_PP(&stmt->param.vars[i]); --- > stmt->stmt->params[i].buffer = (gptr)&Z_LVAL_PP(&stmt->param.vars[i]); 605c605 < stmt->stmt->params[i].buffer = &Z_LVAL_PP(&stmt->param.vars[i]); --- > stmt->stmt->params[i].buffer = (gptr)&Z_LVAL_PP(&stmt->param.vars[i]); - ビルドしてインストールする。 $ make $ sudo make install ===== ビルドした PHP をテストする ===== $ cp php.ini-dist php.ini $ vi php.ini php.ini に extension をロードするように追記する。 extension=modules/pcre.so テストを実行する。 $ make test ~省略~ PASS XMLWriter: libxml2 XML Writer, file buffer, flush [ext/xmlwriter/tests/OO_001.phpt] PASS XMLWriter: libxml2 XML Writer, membuffer, flush [ext/xmlwriter/tests/OO_002.phpt] PASS XMLWriter: libxml2 XML Writer, membuffer, flush, text, attribute [ext/xmlwriter/tests/OO_003.phpt] PASS XMLWriter: libxml2 XML Writer, file buffer, flush [ext/xmlwriter/tests/OO_004.phpt] PASS XMLWriter: libxml2 XML Writer, comments [ext/xmlwriter/tests/OO_005.phpt] PASS XMLWriter: libxml2 XML Writer, startDTD/writeElementNS [ext/xmlwriter/tests/OO_006.phpt] FAIL XMLWriter: libxml2 XML Writer, Elements & Attributes [ext/xmlwriter/tests/OO_007.phpt] PASS XMLWriter: libxml2 XML Writer DTD Element & Attlist [ext/xmlwriter/tests/OO_008.phpt] FAIL XMLWriter: PI, Comment, CDATA [ext/xmlwriter/tests/OO_009.phpt] ===================================================================== TIME END 2012-10-30 23:23:40 ===================================================================== TEST RESULT SUMMARY --------------------------------------------------------------------- Exts skipped : 56 Exts tested : 23 --------------------------------------------------------------------- Number of tests : 2264 1666 Tests skipped : 598 ( 26.4%) -------- Tests warned : 0 ( 0.0%) ( 0.0%) Tests failed : 13 ( 0.6%) ( 0.8%) Tests passed : 1653 ( 73.0%) ( 99.2%) --------------------------------------------------------------------- Time taken : 52 seconds ===================================================================== ===================================================================== FAILED TEST SUMMARY --------------------------------------------------------------------- Testing $argc and $argv handling (GET) [tests/basic/011.phpt] Test 7: DTD tests [ext/dom/tests/dom007.phpt] iconv stream filter [ext/iconv/tests/iconv_stream_filter.phpt] date_sunrise() and date_sunset() functions [ext/standard/tests/general_functions/sunfuncts.phpt] Bug #32001 (xml_parse*() goes into infinite loop when autodetection in effect), using UTF-* [ext/xml/tests/bug32001.phpt] Bug #35447 (xml_parse_into_struct() chokes on the UTF-8 BOM) [ext/xml/tests/bug35447.phpt] XMLReader: libxml2 XML Reader, DTD [ext/xmlreader/tests/008.phpt] XMLReader: accessing empty and non existing attributes [ext/xmlreader/tests/012.phpt] Bug #38431 (xmlrpc_get_type() crashes PHP on objects) [ext/xmlrpc/tests/bug38431.phpt] XMLWriter: libxml2 XML Writer, Elements & Attributes [ext/xmlwriter/tests/007.phpt] XMLWriter: PI, Comment, CDATA [ext/xmlwriter/tests/009.phpt] XMLWriter: libxml2 XML Writer, Elements & Attributes [ext/xmlwriter/tests/OO_007.phpt] XMLWriter: PI, Comment, CDATA [ext/xmlwriter/tests/OO_009.phpt] ===================================================================== You may have found a problem in PHP. We would like to send this report automatically to the PHP QA team, to give us a better understanding of how the test cases are doing. If you don't want to send it immediately, you can choose "s" to save the report to a file that you can send us later. Do you want to send this report now? [Yns]: s ===== 参考文献 ===== [[http://www.atmarkit.co.jp/flinux/rensai/buildlamp/lamp_26/26_1.html|第26回 早速PHPをビルド! そしてテスト!]]\\ [[http://www.ahref.org/tech/server/server-tips/667.html|Apache2で複数バージョンのPHPを使い分ける]]\\ [[http://php.net/manual/ja/install.php|PHP: インストールと設定 - Manual]]\\ [[http://kadoppe.com/archives/2012/08/install-php51-52-with-openssl-to-centos63.html|CentOS 6.3に「–with-openssl」オプション付きでPHP 5.1/5.2系をインストールしようとするとエラー → 解決]]\\ [[http://bytes.com/topic/php/answers/824379-compiling-php-5-1-6-fedora-9-a|Compiling PHP-5.1.6 on Fedora 9]]\\ [[http://forums.freebsd.org/showthread.php?p=63484|[Solved] Error in Installing php5-mysqli - The FreeBSD Forums]]\\ [[http://lists.mysql.com/commits/29244|PHP mysqlnd svn commit: r415 - in trunk: php5/ext/mysqli php6/ext/mysqli]]\\ [[http://tairand.exblog.jp/6673884/|php5 のbuild 3 : まったり生活記:のーたれ ~脳内垂れ流し~]]\\