PHP 5.5.1 をソースからインストールする

> [!NOTE]
> この記事は 2013/07/31 に [momoto.github.io](http://momoto.github.io/) へ投稿した内容を Qiita へ移行してきたものです

　[PHP 5.5.1](http://php.net/releases/5_5_1.php) をソースコードからビルドして、Unix系システムへインストールする手順の記録です。 この記事では CentOS 6.4 環境でインストールの例を示しますが、自身でソースからビルドする方法は特定の Linux ディストリビューションに依りません。

　インストールを行うユーザは、インストール先ディレクトリに対して書込み権限をもっている必要があります。 `/usr/local/*` にインストールする場合、通常、root 権限が必要です。

## 1. ソースコードを取得する

　ソースコードをインストールするマシンに用意します。 インターネットからダウンロードする場合、[php.net](http://www.php.net/downloads.php) にソースコードの URL が示されています。 bzip2、gzip、xzのアーカイブが用意されていますので、マシンで解凍・展開できる形式を選択してください。

　ダウンロードには [cURL](https://curl.haxx.se) や [GNU Wget](https://www.gnu.org/software/wget/) などのダウンロードマネージャやウェブブラウザを使用します。 次の例では、cURL をつかって [php-5.5.1.tar.gz](http://museum.php.net/php5/php-5.5.1.tar.gz) をダウンロードします。

```shell-session
[root@localhost ~]# curl -Lso php-5.5.1.tar.gz http://jp2.php.net/get/php-5.5.1.tar.gz/from/jp1.php.net/mirror
```

　取得したアーカイブファイルは適宜、解凍・展開して、ワーキングディレクトリを移動させます。 [FHS](http://www.pathname.com/fhs/) に準拠するシステムであれば、独自にインストールするソフトウェアのためのディレクトリ `/usr/local` が予め用意されていますので、この記事ではソースコードを `/usr/local/src` に配置してインストールをすすめます。

```shell-session
[root@localhost ~]# tar xfz php-5.5.1.tar.gz -C /usr/local/src/
[root@localhost ~]# cd /usr/local/src/php-5.5.1
[root@localhost php-5.5.1]#
```

## 2. インストール要件を満たす

　マシンがインストールの要件を満たしている必要があります。 また、必要な拡張モジュールがある場合は、そのモジュールの要件も満たす必要があります。

```shell-session:Cコンパイラ
[root@localhost ~]# yum install gcc
```

```shell-session:Make
[root@localhost ~]# yum install make
```

## 3. ビルドファイルを作成する

　`configure` をつかってビルドファイルを作成します。 `configure` にオプションを与えることで、インストール先のディレクトリや有効にするモジュールを調整できます。 指定できるオプションについては `configure --help` や [Manual](http://php.net/manual/ja/configure.about.php) を参照してください。 ビルドの要件を満たしていない場合、`configure` の処理は中断されます。

　例えば、インストール先のディレクトリを `/usr/local/php-5.5.1` として、 [Apacheモジュール](http://www.php.net/manual/ja/book.apache.php), [MySQLiモジュール](http://www.php.net/manual/ja/book.mysqli.php), [PDO MySQLモジュール](http://www.php.net/manual/ja/ref.pdo-mysql.php), [OpenSSLモジュール](http://www.php.net/manual/ja/book.openssl.php) を有効にする場合は次のように `configure` を実行します。

```shell-session
[root@localhost php-5.5.1]# ./configure \
--prefix=/usr/local/php-5.5.1 \
--with-apxs2=/usr/local/httpd-2.4.6/bin/apxs \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-openssl
```

　次に、configureのエラー例をいくつか示します。

#### xml2-config not found.

```
checking for xml2-config path...
configure: error: xml2-config not found. Please check your libxml2 installation.
```

　[libxmlモジュール](http://www.php.net/manual/ja/book.libxml.php) （デフォルトで有効）の要件である libxml が必要です。

```shell-session
[root@localhost php-5.5.1]# yum install libxml2-devel
```

#### configure: error: Cannot find OpenSSL’s <evp.h>

```shell-session
configure: error: Cannot find OpenSSL's <evp.h>
```

　[OpenSSLモジュール](http://www.php.net/manual/ja/book.openssl.php) の要件である OpenSSL が必要です。

```shell-session
[root@localhost php-5.5.1]# yum search install openssl-devel
```

　`configure` の処理が終了して `Makefile` が作成されていれば、ビルドの段階へすすみます。

## 4. ビルドとインストール

　ビルドとインストールには `make` を使います。ディスクの容量が充分足りていることを確認してください。

```shell-session
[root@localhost php-5.5.1]# make && make install
```

　`make` の処理が無事に終了したらインストールは完了です。 `configure --prefix` に指定した位置にファイルが展開されているはずです。

```shell-session
[root@localhost php-5.5.1]# /usr/local/php-5.5.1/bin/php -v
PHP 5.5.1 (cli)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
```

## インストール後

　必要に応じて、php.ini の設定、実行バイナリへのパスの設定を行なってください。 ソースコードのアーカイブには標準の php.ini が、開発環境向けと運用環境向けの２通り用意されています。

```shell-session
[root@localhost php-5.5.1]# cp /usr/local/src/php-5.5.1/php.ini-development /usr/local/php-5.5.1/lib/php.ini
```

　新しく設置した php.ini が正常に認識されているかどうかは `--ini` オプションで出力される Loaded Configuration File などで確認できます。

```shell-session
[root@localhost php-5.5.1]# ./bin/php --ini
Configuration File (php.ini) Path: /usr/local/php-5.5.1/lib
Loaded Configuration File:         /usr/local/php-5.5.1/lib/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed:      (none)
```

　標準のままの状態ではタイムゾーン未設定の警告がでますが、`date.timezone` ディレクティブにタイムゾーンを設定するとこの警告は出なくなります。その他のディレクティブも用途にあわせて設定してください。

```shell-session
PHP Warning:  Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in Unknown on line 0
```

```ini:php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Tokyo
```

## 動作を確認する

　最後に、PHP 5.5.1 の動作を少し確認してみます。 ここでは PHP の拡張モジュールが正常に機能しているかどうかを中心に確かめていきます。

#### apache2.x

　Apache の設定ファイル（httpd.confなど）に `LoadModule` ディレクティブを正しく記述していることを確認します。

```conf:httpd.conf
LoadModule php5_module        modules/libphp5.so
```

　また、PHP ファイルを Apache ハンドラに指定するため、SetHandler や AddHandler などのディレクティブも必要です。

```conf:httpd.conf
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>
```

　libphp5.so は、`configure --with-apxs2=FILE` オプションを指定していれば、PHP のインストール時に作成されているはずです。

```shell-session
[root@localhost httpd-2.4.6]# file modules/libphp5.so
modules/libphp5.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
```

　`apachectl -M` オプションをつかって、読み込まれているモジュールを確認することもできます。

```shell-session
[root@localhost httpd-2.4.6]# apachectl -M | grep php5_module
 php5_module (shared)
```

#### MySQLiモジュール

　mysqli モジュールを確認します。 `PHP Warning: PHP Startup: Unable to load dynamic library 'php_mysqli.dll'` と警告が出る場合はモジュールがうまく読み込まれていません。

```shell-session
[root@localhost php-5.5.1]# php -m | grep mysqli
mysqli

[root@localhost php-5.5.1]# php -r "var_dump(class_exists('mysqli'));"
bool(true)
```

#### PDO MySQLモジュール

　pdo_mysql モジュールを確認します。 `PHP Warning: PHP Startup: Unable to load dynamic library 'php_pdo_mysql.dll'` と警告が出る場合はモジュールがうまく読み込まれていません。

```shell-session
[root@localhost php-5.5.1]# php -m | grep -i pdo
PDO
pdo_mysql
pdo_sqlite

[root@localhost php-5.5.1]# php -r 'print_r(PDO::getAvailableDrivers());'
Array
(
    [0] => mysql
    [1] => sqlite
)
```

## 参考

- [PHP: PHP マニュアル – Manual](http://www.php.net/manual/ja/)