作成開始 : 平成20年08月07日(木) 最終更新日 : 平成20年09月22日(月)
PHP5 を試す
例によってソースからインストールしてみました。
せっかくなのでPHPスクリプトなどでコメント投稿時の認証やグラフなどの画像処理もしてみたいので関係するライブラリなどもインストールしてみました。
作業はすべて root で実行しました。(Wheelユーザでログインし su -l
でスーパーユーザに移行)
tarで展開したソースは uninstall や機能追加に備えて残しておくとよいでしょう。
1.関係ライブラリのインストール
以下のライブラリがあるか探してみました。
ライブラリ名 用 途
install有無 最新Version URL zlib zip や gzip に使われている圧縮アルゴリズムをライブラリ化したもの。 ○ 1.2.3 zlib Home Site libSSH2 SSH2プロトコルを実行するライブラリ × 2.0.18 Main Page - Libssh2 Curl 多くの異なったプロトコルで様々なサー バーと接続し、通信することが可能になる。 × 7.18.2 libjpeg JPEG 形式の画像を処理するライブラリ × 6b Independent JPEG Group libpng PNG 形式の画像を処理するライブラリ × 1.2.29 libpng.org: top level FreeType2 Free な TrueType フォントのレンダリング用ライブラリ × 2.3.7 The FreeType Project GD オープンソースなグラフィック・ライブラリ × 2.0.34 GD Graphics Library libmcrypt CBC , OFB , CFB , ECB 暗号モードの DES , TripleDES , Blowfish , 3-WAY , SAFER-SK64 , SAFER-SK128 , TWOFISH , TEA , RC2 , GOST のような広範なブロックアルゴリズムをサポートするmcryptライブラリ × 2.5.8 libxml2 PHP5で拡張モジュール libxml を使う時のインストールに必要 × 2.6.32 The XML C parser and toolkit of Gnome ※Curlをインストールするには Openssl の libcrypt.so 及び libSSH2 が要る。
今回、各ライブラリは --prefix=/usr/local にして(自分にとって)管理しやすいようにしてみます。
インストールされているかどうかの確認はもっと別の有効な方法があるかもしれません。--shared および --enable-shared はダイナミックライブラリとして作成のオプションです。
(1) zlib のインストール
・インストールされているバージョンの確認
find / -name libz.so でインストール先を確認する。
/usr/lib/libz.so | grep Copyright で表示されます。(左記例は libz.so が /usr/lib にあった場合です)
やってみたけど・・・・
↓
まぁ、いいや --prefix でここの使わないようにすれば・・・ってことで継続っ。・上記のサイトからソース ( zlib-1.2.3.tar.gz ) をダウンロードする。
・zlib-1.2.3.tar.gz を /usr/local/src に保存しカレントディレクトリを /usr/local/src に移動する。
・tar zxf zlib-1.2.3.tar.gz でソースを展開する。すると zlib-1.2.3 というディレクトリ以下に展開される。
・カレントディレトリを /usr/local/src/zlib-1.2.3 に移動する。
・./configure --prefix=/usr/local --shared を実行する。
・make test を実行する。・・・・ *** zlib test OK *** となればOKのようです。
・make install を実行する。
バージョンの確認してみたけど・・・・この方法では確認できないみたいです。
でも、/usr/local/lib にあることがわかりましたね。
↓![]()
(2)libSSH2 のインストール
・インストールされているか確認
find / -name libssh2.so で存在するか確認する。・・・・・・・・・・・・・・・・・無かった!
見つかったディレクトリで libssh2.so | grep Copyright を実行してみる。・上記のサイトからソース ( libssh2-0.18.tar.gz ) をダウンードする。
・libssh2-0.18.tar.gz を /usr/local/src に保存しカレントディレクトリを /usr/local/src に移動する。
・tar zxvf libssh2-0.18.tar.gz でソースを展開する。するとlibssh2-0.18 というディレクトリ以下に展開される。
・カレントディレクトリを /usr/local/src/libssh2-0.18 に移動する。・./configure --prefix=/usr/local、make、make install を実行する。
バージョンの確認してみたけど・・・・やっぱりこの方法では確認できないみたいです。
でも、/usr/local/lib にあることがわかりましたね。
↓
(3)Curl のインストール
・インストールされているか確認
find / -name curl で存在するか確認する。・・・・・無かった!
(あったら)見つかったディレクトリで curl -V か 見つかったディレクトリのパス/curl -V を実行してみる。・上記のサイトからソース ( curl-7.18.2.tar.gz ) をダウンロードする。
・curl-7.18.2.tar.gz を /usr/local/src に保存しカレントディレクトリを /usr/local/src に移動する。
・tar zxvf curl-7.18.2.tar.gz でソースを展開する。 すると curl-7.18.2 というディレクトリに展開される。
・カレントディレクトリを /usr/local/src/curl-7.18.2 に移動する。
・./configure --prefix=/usr/local --with-ssl=/usr/local/ssl --with-libssh2= /usr/local を実行する。
こんなんなりましたぁー
↓・make、 make install を実行する。
※configure: error: OpenSSL libs and/or directories were not found where specified! が出た時は OpenSSLの libcrypt.so が無いということらしい。 find で探してもない時は OpenSSL を以下のようにインストールとする。
・openssl-0.9.8h.tar.gz をダウンロードする。
・/usr/local/src に保存する。カレントディレクトリを /usr/local/src に移動する。
・tar zxvf openssl-0.9.8h.tar.gz で展開する。
・カレントディレクトリを /usr/local/src/openssl-0.9.8h に移動する。
・./config --prefix=/usr/local shared、make、make install する。
これ、やっぱりここでやっておくべきでした。
先にインストールされていた 0.9.6a に設定されてしまいました。・バージョンを確認してみました。/usr/local/bin にあることがわかりますね。
↓
![]()
(4)libjpeg のインストール
find/ -name libjpeg.a で存在するか確認する。・・・・・無かった!・上記のサイトから ( jpegsrc.v6b.tar.gz ) をダウンロードする。
・jpegsrc.v6b.tar.gz を /usr/local/src に保存しカレントディレクトリを /usr/local/src に移動する。
・tar zxvf jpegsrc.v6b.tar.gz でソースを展開する。 すると jpeg-6b というディレクトリに展開される。
・カレントディレクトリを /usr/local/src/jpeg-6b に移動する。
・./configure --prefix=/usr/local --enable-shared 、make、make install を実行する。
[GDインストール・設定]より引用
(PHP のビルド前に) jpeg-v6b ライブラリをビルドする際、configure で --enable-shared オプションを指定する必要があります。 そうしないと、PHP をビルドする際の configure で libjpeg.(a|so) not found というエラーが発生します。
(5)libpng のインストール
・インストールされているか確認
find / -name libpng.so で存在するか確認する。・・・・・無かった!
・上記のサイトから ( libpng-1.2.29.tar.gz ) をダウンロードする。
・libpng-1.2.29.tar.gz を /usr/local/src に保存しカレントディレクトリを /usr/local/src に移動する。
・tar xvzf libpng-1.2.29.tar.gz でソースを展開する。 すると libpng-1.2.29 というディレクトリに展開される。
・カレントディレクトリを /usr/local/src/libpng-1.2.29 に移動する。
・./configure --prefix=/usr/local 、make、make install を実行する。
(6)FreeType2 のインストール
※GNU Make (gmake)が要ります。
※無い時はインストールしましょう。・インストールされているか確認
find / -name libfreetype.so で存在するか確認する。・・・・無かった!
・上記のサイトから ( freetype-2.3.7.tar.gz ) をダウンロードする。
・freetype-2.3.7.tar.gz を /usr/local/src に保存しカレントディレクトリを /usr/local/src に移動する。
・tar xvzf freetype-2.3.7.tar.gz ででソースを展開する。 すると freetype-2.3.7 というディレクトリに展開される。
・カレントディレクトリを /usr/local/src/freetype-2.3.7 に移動する。
・env GNUMAKE="/usr/local/bin/gmake" ./configure --prefix=/usr/local を実行する。
・gmake、gmake install を実行する。
(7)GDのインストール
※インストールにあたっては XFree86 関連のフォントライブラリが要ります。
・・・・ということなので、非力なPCにX-Windowシステムはインストールしたくないことから PHP付属のGDライブラリを使うことにしました。
[GD インストール手順]より引用
PHPでGDサポートを有効にするには、configure に--with-gd[=DIR]を指定します。ただし、DIRは GDのベースインストールディレクトリです。 PHPにバンドルされている推奨のGDライブラリを使用するには --with-gdを指定します。 GD ライブラリをコンパイルするには、libpng と libjpeg が必要です。
[GD インストール設定]より引用
注意: PHP 4.3以降、GD libの付属版が付属しています。この付属版にはαブ レンディングのようないくつかの機能が追加されています。 この版のコードは、より管理が行き届き、安定しているため、 外部ライブラリの代わりに使用されるべきです。
(8) libmcrypt のインストール
・インストールされているか確認
find / -name '*libmcrypt*' で存在するか確認する。・・・・無かった。
・上記のサイトから ( libmcrypt-2.5.8.tar.gz ) をダウンロードする。
・libmcrypt-2.5.8.tar.gz を /usr/local/src に保存しカレントデイレクトリを /usr/local/src に移動する。
・tar xzvf libmcrypt-2.5.8.tar.gz でソースを展開する。すると libmcrypt-2.5.8 というディレクトリに展開される。
・カレントディレクトリを /usr/local/src/libmcrypt-2.5.8 に移動する。
・./configure --prefix=/usr/local --disable-posix-threads を実行する。
[Mcrypt インストール手順]より引用
この拡張機能を利用可能にするためには、 PHP を --with-mcrypt パラメータを 付けてコンパイルする必要があります。DIR は mcrypt のインストール ディレクトリです。必ず、 --disable-posix-threadsを付けて libmcrypt をコンパイルするようにしてください。
・make、make install を実行する。
(9) libxml2 のインストール
find / -name '*libxml*' で存在するか確認する。・・・・・無かった!
・上記のサイトから ( libxml2-2.6.32.tar.gz ) をダウンロードする。
・ libxml2-2.6.32.tar.gz を /usr/local/src に保存しカレントディレクトリを /usr/local/src に移動する。
・ tar xzvf libxml2-2.6.32.tar.gz でソースを展開する。すると libxml2-2.6.32 というディレクトリに展開される。
・カレントディレクトリを /usr/local/src/libxml2-2.6.32 に移動する。
・./configure --prefix=/usr/local を実行する。
・make、make install を実行する。
2.PHP5のインストール
(1)ソースのダウンロード
日本 PHP ユーザ会 (Japan PHP Users Group) :: メイン から php-5.2.6.tar.gz をダウンロードする。
(2)ソースのアップロード
(例によって) /usr/local/src にアップロードする。
(3)ソースの展開
サーバーにログインしカレントディレクトリを /usr/local/src に移動する。
tar xzvf php-5.2.6.tar.gz で展開する。すると php-5.2.6 というディレクトリができる。
(4)configure を実行する。
念のため Apache2 は停止しておきましょう。( sh /usr/local/etc/rc.d/apache2.sh stop )
カレントディレクトリを /usr/local/src/php-5.2.6 に移動する。
実行前にconfigureオプションを整理しておきます。
オプション
説 明
--enable-mbstring mbstring (マルチバイト文字列)関数を有効にします。このオプションは、 mbstring 関数を利用するために必要です。 --enable-mbregex マルチバイト正規表現関数を有効にする。 --enable-zend-multibyte PHP国際化を有効にする。 --prefix=/usr/local インストール先ディレクトリを /usr/local に指定する。 --with-gd GDライブラリ(PNGやJPEG、GIF形式のイメージを生成する為のライブラリ。)を使用する。 --with-jpeg-dir=/usr/local libjpegの場所を指定。 --with-png-dir=/usr/local libpngの場所を指定。 --with-freetype-dir=/usr/local freetype2の場所を指定 --with-zlib zlibを使用する。 --with-zlib-dir=/usr/local zlibの場所を指定。 --with-openssl=/usr/local opensslを使用する。 --with-iconv このモジュールにより、ローカルな文字集合で表された文字列を、Unicode 文字集合のような他の文字集合で表わされた文字列に変換することがでる。(libiconv使用) --enable-ftp FTP関数を有効にする。 --with-curl libcurlを使用する。 --with-mcrypt=/usr/local Mcrypt 暗号化関数を使用する。 --with-mysql=/usr/local/mysql mysqlの場所を指定。 --with-mysql-sock=/tmp/mysql.sock phpがmysqlに接続するためのソケットの場所を指定。 --with-mysqli=/usr/local/mysql/bin/mysql_configmysql 拡張サポート。(PHP: エイリアスおよび非推奨の Mysqli 関数 - Manual)--with-apxs2=/usr/local/apache2/bin/apxs APXSを使ってlibphp5.soを生成する。 ./configure で上記オプションを指定し実行します。長いのでそれぞれ「\」で区切って入力するとよいでしょう。
↑
こんなん表示したらOKみたいです。
(5) make を実行する。
しかし、なぜか次のを表示して stop しました。
/usr/libexec/elf/ld: cannot find -lltdl
調べてみると、どうやら libtool が無いってことらしい。
まったり生活記:のーたれ 〜いつも心で鼻歌を〜 : php5 のbuild 3 をもとに Problem while re-compiling php - DirectAdmin Forums を参考にして次のようにインストールしてみた。
/usr/local/src/libmcrypt-2.5.8/libltdl に移動
./configure --enable-ltdl-install
make
make install とした。
どうやら前記は通ったようだが、下のエラーでまた stop した。
ext/openssl/.libs/openssl.o: In function `zif_openssl_sign':
/usr/local/src/php-5.2.6/ext/openssl/openssl.c(.text+0x6336): undefined reference to `EVP_MD_CTX_cleanup'
ext/openssl/.libs/openssl.o: In function `zif_openssl_verify':
/usr/local/src/php-5.2.6/ext/openssl/openssl.c:3565: undefined reference to `EVP_MD_CTX_cleanup'
*** Error code 1
Stop in /usr/local/src/php-5.2.6.
どうやら、これは、OpenSSL関連のエラーのようです。
OpenSSLは0.9.7以降が必要なようです。 ・・・・うわぁーーーーここにきてかぁい。
PHPでOpenSSL使わなくてもいいけどなぁー・・・・インストールするかーでインストールしました。バージョンは 0.9.8h になっていました。
とりあえず終わったようですが、以下のWarning が(ドキッ libcurl時に古いopenssl使ったから?)・・・・・後でチェックするけど作業を継続っ!
/usr/libexec/elf/ld: warning: libssl.so.2, needed by /usr/local/lib/libcurl.so,may conflict with libssl.so.0.9.8
/usr/libexec/elf/ld: warning: libcrypto.so.2, needed by /usr/local/lib/libcurl.so, may conflict with libcrypto.so.0.9.8
Build complete.
Don't forget to run 'make test'.
(6) make install を実行する。
3.インストール後の設定
(1) php.ini の準備
cp /usr/local/src/php-5.2.6/php.ini-dist /usr/local/lib/php.ini として保存します。
(2) php.ini の編集
次のように編集します。
;; 出力バッファリングを有効にする
output_buffering = On
;; mb_output_handlerによる出力変換を有効にする
output_handler = mb_output_handler
;;GET, POST, COOKIE で受け取るデータに含まれる ', ", \, NULL値 をバックスラッシュ (\) で自動エスケープするかどうか!
magic_quotes_gpc = Off
;;mbstring (マルチバイト処理) でデフォルトとする言語を設定
mbstring.language = Japanese
;; 内部文字エンコーディングのデフォルト値を設定
mbstring.internal_encoding = EUC-JP
;;HTTP 入力文字エンコーディングのデフォルト値を設定
mbstring.http_input = auto
;; HTTP 出力文字エンコーディングのデフォルト値を設定
mbstring.http_output = EUC-JP
;; 自動エンコードするかどうか!
mbstring.encoding_translation = On
;PHP の文字列中の文字コードを判定するためのコード順を設定
mbstring.detect_order = auto
;;コード変換する際に、コードが変換できない文字等をどのように扱うかを指定
;; none は、変換できない文字は出力しない
mbstring.substitute_character = none;
;;シングルバイト対応の関数を mbstring 関数の対応する関数でオーバーロード (置換);
;PHP: マルチバイト文字列 関数 - Manual を参照
;;セッションデータファイルの保存及び検索ディレクトリ
session.save_path = "/tmp"
;;ドキュメントルートの指定
doc_root = /usr3/httpd/html
(3)Apache2 の設定変更
/usr/local/apache2/conf/httpd.conf に以下を追加します。
AddType application/x-httpd-php .php
また、DirectoryIndex に index.php を追加してもよいでしょう。
LoadModule php5_module modules/libphp5.so の記述があるかを確認しましょう。
とりあえず、ここまでで Apache を起動 (sh /usr/local/etc/rc.d/apache2.sh start) して phpinfo を表示してみました。
ですが、やっぱり openssl のバージョンが 0.9.6a でした。
なので、openssl 0.9.8h をインストールして Curl のリコンパイルと php5 のリコンパイルをしてみました。
・・・ですがやっぱ変わりまへん。このまま行くことにします。_| ̄|○※悪意を持ってアップロード (あるいは作成) された exploit.php.jpg のようなファイルが PHP として実行されてしまわないように以下を追記しましょう。
<FilesMatch "\.ph(p[2-6]?|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>※また、拡張子 .phps のファイルを PHP ソースファイルとして扱うには、これを追加します。
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>(上記の「※」は PHP: Apache 2.0 (Unixシステム用) - Manualより引用しています。
設定が終わったら sh /usr/local/etc/rc.d/apache2.sh start で Apache2 を起動します。
(4)動作の確認
以下を記述したファイルをエディタで作成し test.php とかというファイル名で保存します。
<?php
phpinfo();
?>そしてブラウザから http://serverIP/test.php でPHPの設定情報が表示されたらOKです。
設定内容が思惑どおりになっていることを確認しましょう。
もし違っていたら configure から繰り返しましょう。
●平成20年09月05日(金) 追記
とあるCMSを利用したいと思いPDO接続を使ってMySQLに接続(pdo_mysql)設定をしてみました。
例によって検索エンジンで検索してチャレンジしましたが、どうもうまくいきませんでした。
やってみたことは・・・・
pecl download pdo_mysql して phpize して ./configure --with-pdo-mysql=/usr/local/mysq したけど make ができない。
なんか Makefile がうまくできなかったみたいです。
pecl install pdo_mysql もだめ
さらに、/usr/local/src/php-5.2.6/ext/pdo_mysql に移動して pecl download pdo_mysql して phpize して ./configure --with-pdo-mysql=/usr/local/mysq したけどやっぱり make ができない。せっかく phpize のため autoconf-2.61、m4-1.4.10 をインストールしたのに・・・・
これは phpize した時に以下のエラーが出たのに対処したものです。
Armada# phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOC
ONF
environment variable is set correctly and then rerun this script.
●autoconfインストールの前に GNU M4 をインストールしておかないといけません。
ソースを ftp://ftp.gnu.org/gnu/m4/ からGETします。
2008/09/04 現在 m4-1.4.11.tar.gz ( 04/02/2008 06:54午後 1,168,840 ) でした。・・・がこれバグあるみたいで make でエラーでます。
よって m4-1.4.10.tar.gz(07/10/2007 12:00午前 928,375)をGETしました。
例によって /usr/local/src に保存します。
カレントディレクトリを /usr/local/src にします。
tar zxvf m4-1.4.10.tar.gz で解凍します。
カレントディレクトリを /usr/local/src/m4-1.4.10 にします。
./configure --prefix=/usr/local を実行します。
make します。
make install します。
●autoconfのインストール
ソースを http://www.gnu.org/software/autoconf/ からGETします。
2008/09/04 現在 autoconf-2.62.tar.gz (08-Apr-2008 15:01 1.4M) でした。・・・がこれも make でエラーでます。
よって autoconf-2.61.tar.gz(17-Nov-2006 14:14 1.3M)にしました。
例によって /usr/local/src に保存します。
カレントディレクトリを /usr/local/src にします。
tar zxvf autoconf-2.61.tar.gz で解凍します。
カレントディレクトリを /usr/local/src/autoconf-2.61 にします。
./configure --prefix=/usr/local を実行します。
ところがここで以下のメッセージでstopしてしまいます。
checking whether m4 supports frozen files... no
configure: error: GNU M4 1.4 is required
実は /usr/bin/m4 に古いのがあって configure で最初にここが見つかるためらしいです。
./configure --help とかでパラメータ見ても m4 の位置を渡すパラメータが無いようでした。
仕方なく mv /usr/bin/m4 /usr/bin/m4.org にして configure したら通りました。
make します。
make install します。
結局PHPのconfigureに--with-pdo-mysql=/usr/local/mysql をしてPHPのインストールし直してうまくいった。
その時の configure は次のとおりです。
そして、php_info() に次があることを確認しました。
それで、本当に動作しているか次のスクリプトで確認しました。
そしたら見事に「pdo_mysqlによる接続OKです」を表示しました。
●平成20年09月22日(月) 追記
最近のスクリプトでは UTF-8 で書かれたものが増えてきました。なので各設定は次のようにしてみました。
それと文字化け対策もしてみました。
[参考にしたとこ]
PHPの文字化け - 5つの誤解と5つの対策
PHPの文字化けを本気で解決する
;; 出力バッファリングを有効にする
output_buffering = Off
;; mb_output_handlerによる出力変換を有効にする
output_handler = mb_output_handler
;;GET, POST, COOKIE で受け取るデータに含まれる ', ", \, NULL値 をバックスラッシュ (\) で自動エスケープするかどうか!
magic_quotes_gpc = Off
;;mbstring (マルチバイト処理) でデフォルトとする言語を設定
;;これは内部言語のことではありません。mb_send_mail関数を利用した際にのみ使用されるものです。
;;よって実質的には意味無いものかも・・・
mbstring.language = Japanese
;; 内部文字エンコーディングのデフォルト値を設定
;;これは内部エンコードのことではありません。mbstring関数のデフォルトエンコードのことです。
;;mb_convert_kana関数などで変換元文字コードの指定がない場合に使用されるものです。
;;変換元文字コードを固定にするため「ソースコードの文字コードと揃えておく」と良いでしょう。
mbstring.internal_encoding = UTF-8
;;HTTP 入力文字エンコーディングのデフォルト値を設定
mbstring.http_input = pass
;; HTTP 出力文字エンコーディングのデフォルト値を設定
;;これを指定しても自動的に文字コードは変換されません。これは指定しないほうがよいでしょう。
mbstring.http_output = pass
;; 自動エンコードするかどうか!
mbstring.encoding_translation = Off
;;PHP の文字列中の文字コードを判定するためのコード順を設定
;;これを auto にしてはいけません。
;;未指定または"auto" の時は "ASCII,JIS,UTF-8,EUC-JP,SJIS" の順に展開されます。
;;ここは出力する文字コードを先頭にし,JISやASCIIは最後の方に設定します.
mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII
;;コード変換する際に、コードが変換できない文字等をどのように扱うかを指定
;; none は、変換できない文字は出力しない
mbstring.substitute_character = none;
;;シングルバイト対応の関数を mbstring 関数の対応する関数でオーバーロード (置換);
mbstring.func_overload = 0 -------> これを 7 にしたら UebiMiauでメール送信ができなくなったので。
;PHP: マルチバイト文字列 関数 - Manual を参照
;;セッションデータファイルの保存及び検索ディレクトリ
session.save_path = "/tmp"
;;ドキュメントルートの指定
doc_root = /usr3/httpd/html
default_charset という設定項目がありますが、これはデフォルトの文字コードのことではありません。
出力時にHTTPヘッダとして送信する文字コード名のことをいいます。
これを例えば default_charset = UTF-8 などとすべきではありません。Content-Typeが固定されるため例えば sjis で書いたソース内の <head>〜</head>の間に次のような記述をしてもブラウザのエンコードが UTF-8 に固定されるため文字化けしてしまいます。
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
・・・っていうか、default_charsetを指定しないでソースのヘッダ部分に上記のように指定しようということですね。
細かい設定はスクリプトを置くディレクトリの、.htaccessかプログラム内部で行った方がよいでしょう。
[設定結果]
次のをクリックしてみてください。そして、ブラウザの「エンコード」を確認してみてください。
UTF-8でソースを記述、EUCでソースを記述、SJISでソースを記述
【戻る】