LAMP環境をソースからビルドしてみた(PHP編)

 先日投稿したApache編に引き続いて、今回はPHPをソースインストールしていきます。作業環境その他諸々は前回と同じなので割愛します。

PHPソースの入手

 PHPの公式サイトからソースを取得してきます。そういえば、ファイルのダウンロードといえばwgetがありましたね。なんで前回忘れてたんだろ。

$ wget https://www.php.net/distributions/php-8.1.1.tar.gz
$ wget https://www.php.net/distributions/php-8.1.1.tar.gz.asc

 前回同様署名を検証し、アーカイブを展開していきます。

$ gpg --verify php-8.1.1.tar.gz.asc
$ gzip -d php-8.1.1.tar.gz
$ tar xvf php-8.1.1.tar

依存関係の解決

 こちらも前回同様、インストールしていくうえで必要なパッケージなどを準備していく必要があります。何が必要なのかは、公式ドキュメントにすべて示されています。
PHP: Unix システムへのインストール - Manual

autoconf

 autoconfはconfigureファイルを自動で生成してくれるツールです。これからインストールするPHPのバージョンは8.1.1なので、バージョン2.64以上を選択します。とりあえず今回は最新版をインストールします。

$ wget http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.xz
$ xz -d autoconf-latest.tar.xz
$ tar xvf autoconf-latest.tar
$ cd autoconf-latest
$ ./configure
(略)
GNU M4 1.4.6 or later is required; 1.4.16 or newer is recommended.

 autoconfはM4言語のマクロなので、M4をインストールする必要があります。先にこちらをインストールしましょう。

$ cd
$ wget http://ftp.gnu.org/gnu/m4/m4-latest.tar.xz
$ xz -d m4-latest.tar.xz
$ tar xvf m4-latest.tar
$ cd m4-latest
$ ./configure
$ sudo make
$ sudo make install

 これでOK。もう一度autoconfのソースフォルダに戻って作業を再開します。

$ ./configure
$ sudo make
$ sudo make install
$ autoconf --version
autoconf (GNU Autoconf) 2.71
(略)

automake

 こちらはMakefileを自動で生成してくれるツールです。autoconfと同様の方法でインストールします。

$ wget https://ftp.gnu.org/gnu/automake/automake-1.16.5.tar.xz 
$ xz -d automake-1.16.5.tar.xz
$ tar xvf automake-1.16.5.tar
$ cd automake-1.16.5
$ ./configure
$ sudo make
$ sudo make install
$ automake --version
automake (GNU automake) 1.16.5
(略)

libtool

 各種ファイルを自動で作成してくれる上記の2ツールとは異なり、libtoolはプラットフォーム間の違いを吸収してくれるインタフェースの役割を持っています。
 インストール方法はこれまで通りです。

$ wget https://ftpmirror.gnu.org/libtool/libtool-2.4.6.tar.gz
$ gzip -d libtool-2.4.6.tar.gz
$ tar xvf libtool-2.4.6.tar
$ cd libtool-2.4.6
$ ./configure
$ sudo make
$ sudo make install
$ libtool --version
libtool --version
libtool (GNU libtool) 2.4.6
(略)

Re2c

 Re2cはLexer(lexical analyzer:字句解析器)を自動で生成するツールです。
 Lexerは与えられた文字列をトークンとして分割する役割を持ち、処理系においては後述するParserと組み合わせて利用します。

$ wget https://re2c.org/https://github.com/skvadrik/re2c/releases/download/2.2/re2c-2.2.tar.xz
$ xz -d re2c-2.2.tar.xz
$ tar xvf re2c-2.2.tar
$ cd re2c-2.2
$ ./configure
$ sudo make
$ sudo make install
$ re2c --version
re2c 2.2

Bison

 BisonはParser(構文解析器)を生成するツールです。
 Lexerと同様、Parserもソースコードの処理時に使用されますが、こちらは複数のトークンを処理し、構文木の構造を作成する役割を持ちます。

$ wget https://ftp.gnu.org/gnu/bison/bison-3.8.tar.xz
$ xz -d bison-3.8.tar.xz
$ tar xvf bison-3.8.tar
$ cd bison-3.8
$ ./configure
$ sudo make
$ sudo make install
$ bison --version
bison (GNU Bison) 3.8
(略)

Configure実行

 必要なライブラリ等がそろったので、PHPのソースディレクトリに移動して./configureを叩きます。

configure: error: in `/home/klag/php-8.1.1':
configure: error: The pkg-config script could not be found or is too old.  Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.

pkg-config

エラーで「pkg-configがない」と言われてしまったので、インストールしていきます。例によって、wgetして展開してconfigure, make, make installします。

$ wget https://pkgconfig.freedesktop.org/releases/pkg-config-0.29.2.tar.gz
$ gzip -d pkg-config-0.29.2.tar.gz
$ tar xvf pkg-config-0.29.2.tar 
$ cd pkg-config-0.29.2
$ ./configure --with-internal-glib
$ make
$ sudo make install
$ pkg-config --version
0.29.2

 オプションとして--with-internal-glibを指定していますが、これはglibが入っていない場合にpkg-config側にバンドルされているglibを使用してビルドを行うためのものです。

 再びPHPのconfigureを行います。

configure: error: Package requirements (libxml-2.0 >= 2.9.0) were not met:

No package 'libxml-2.0' found

libxml2

 今度はlibxml2がないとのこと。インストールしましょう。

$ wget ftp://xmlsoft.org/libxml2/libxml2-2.9.12.tar.gz
$ gzip -d libxml2-2.9.12.tar.gz
$ tar xvf libxml2-2.9.12.tar
$ cd libxml2-2.9.12
$ ./configure
$ make 
$ sudo make install

 再度configureするも、次はsqlite3がないと言われました。

configure: error: Package requirements (sqlite3 >= 3.7.7) were not met:

No package 'sqlite3' found

sqlite3

 DBはMySQLを使うのでサポートは不要なのですが、--without-sqlite3オプションをつけても同じ内容のエラーが出てしまうのでインストールしておきます。

$ wget https://www.sqlite.org/2022/sqlite-autoconf-3370200.tar.gz 
$ gzip -d sqlite-autoconf-3370200.tar.gz 
$ tar xvf sqlite-autoconf-3370200.tar
$ cd sqlite-autoconf-3370200
$ ./configure
$ make
$ sudo make install
$ sqlite3 --version
3.37.2 (略)

 これでOK。
 ここで気が付いたのですが、LAMP環境でPHPを使うにはApache2との連携を行う必要があるとのこと。
 参照:PHP: Apache 2.x (Unixシステム用) - Manual
 いままでは./configureだけを実行していたのですが、次回以降は以下のコマンドを実行していきます。

./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pdo-mysql

 APXSはApacheの拡張モジュールを管理する実行形式ファイルです。これを使ってPHPとの連携をするための設定を行ってくれるものであると思われます。
 PDOはPhp Data Objectsの略で、PHPからDBを利用する際に利用されるものです。今回はMySQL用のものを利用していきます。

 無事configureが通ったので、make, make installしていきます。
 ソースの量が結構あるのでmakeに時間がかかりました。終わったらmake installを叩きます。こちらはすぐに完了しました。

動作確認

PHPApacheの連携ができているかの確認も兼ねて、/usr/local/apache2/htdocs以下に次のような内容のphpinfo.phpを作成します。

<?php
    phpinfo();
?>

 これで(サーバのIPアドレス)/phpinfo.phpにアクセスしたところ、PHPのソース自体が表示されてしまいました。
 公式ドキュメントを確認し、Apacheが.phpファイルをPHPソースとして認識できるように以下のような設定をhttpd.confに追加しました。

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

 Apacheを再起動してページをリロードしたところ、無事phpinfoが表示されました。 f:id:KLag:20220114005510p:plain

まとめ

 前回の作業の経験から、ある程度スムーズに進むようになってきました。ただ、前回に比べてエラーが多く発生し、その解決に時間がかかってしまいました。
 また、他のアプリケーションとの連携を行う際に必要な設定に関して多少は理解が深まったと感じています。
 次回はMySQLのインストールを行っていきます。ではまた。