11
6

More than 5 years have passed since last update.

PHP 7.3をビルドしてApacheと連携させる

Last updated at Posted at 2019-03-03

ビルドした PHP 7.3 を Apache と連携させたいと思いました。

概要

環境

やりたいこと

  • PHP でセッションの動作を確認したい。
    • PHP と Apache を連携させないといけない。

やること

  • Apache 2.4.6 をインストールします。
    • 面倒なのでビルドせずに yum でインストールします(汗)
  • PHP 7.3 をビルドします。
    • 将来的にデバッグしながら動かしてみたいので、あえてビルドします。
    • 最新の開発版には Apache が対応していないので、おとなしく 7.3 にします。1

手順

Apacheをインストールする

yum で Apache をインストールします。
apxs というツールが必要なので httpd-devel もインストールします。

$ sudo yum install httpd httpd-devel

念のため、いろいろ確認しておきましょう。
apxs のパスは PHP をビルドするときに必要になるのでメモしておきます。

$ ls /etc/httpd/
conf  conf.d  conf.modules.d  logs  modules  run
$ which apachectl
/usr/sbin/apachectl

$ which apxs
/usr/bin/apxs

ちなみに、apxs の説明は以下のとおりです(man apxs)。

apxs is a tool for building and installing extension modules for the Apache HyperText Transfer Protocol (HTTP) server. This is achieved by building a dynamic shared object (DSO) from one or more source or object files which then can be loaded into the Apache server under runtime via the LoadModule directive from mod_so.

これを使うと、モジュールを追加するたびに Apache をビルドしなおさずに済み、httpd.confLoadModule を追加するだけでモジュールを追加できるようになるということらしいですね。

デフォルトの DocumentRoot/var/www/html ですが、所有者とパーミッションを変更しておきます。2

$ sudo chown apache:apache /var/www/html
$ sudo chmod 777 /var/www/html

PHPをインストールする

まずは GitHub からソースコードを取得します。
今回は PHP 7.3 を使いたいので、ブランチを指定してチェックアウトします。

$ git clone https://github.com/php/php-src.git
$ git checkout -b PHP-7.3 remotes/origin/PHP-7.3

PHP をビルドします。
configureapxs のパスを指定するところが重要です。3

$ cd php-src
$ ./buildconf
$ ./configure --enable-debug --with-apxs2=/usr/bin/apxs --with-config-file-path=/home/vagrant/php7/
$ make

通常は make install するところですが、複数バージョンを共存させたいので、あえてしません。
ただ、このままでは libphp7.so が Apache のディレクトリにコピーされません。
ということで、シンボリックリンクを作成しておきます。

cd /etc/httpd/modules/
sudo ln -s ~/php-src/libs/libphp7.so libphp7.so

Apacheを設定する

/etc/httpd/conf/httpd.conf に以下を追加します。

LoadModule php7_module modules/libphp7.so

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

追加したら、Apache を再起動します。

apachectl stop
apachectl start

チェックする

まずは、phpinfo() を表示するだけの PHP ファイルを /var/www/html に作成します。
ブラウザーでアクセスすると、以下のように表示されるはずです。

スクリーンショット 2019-03-03 12.17.42.png

ちなみに・・・

もともとやりたかったことは PHP でセッションの動作を確認する ことでした。

ということで、以下のような PHP ファイルを作成しました。

<?php
session_start();
$_SESSION['hoge'] = 'foo';

ブラウザーで PHP ファイルにアクセスすると、どこかにセッションファイルが作成されているはずです。
セッションファイルには セッション ID が含まれています。

セッション ID は Cookie に格納されているので、ブラウザーの開発者ツールで確認することができます。
例えば、Firefox では以下のように、「開発ツール」の「ストレージ」で確認できます。

スクリーンショット 2019-03-03 12.26.20.png

セッション ID がわかったので、find コマンドで検索します。

$ sudo find / -name "*9d589ed8928566f911d*" 2>/dev/null
/tmp/systemd-private-40934c4f7fd945a5b989da2b7141f6de-httpd.service-czqFF3/tmp/sess_9d589ed8928566f911def19013b983f7

なんだかクソ長いファイル名がヒットしましたが、デフォルトでは /tmp の配下に保存されるようですね。
中身を確認すると、たしかにセッションが保存されています。

$ sudo cat /tmp/systemd-private-40934c4f7fd945a5b989da2b7141f6de-httpd.service-czqFF3/tmp/sess_9d589ed8928566f911def19013b983f7
hoge|s:3:"foo";

ところで、この長いファイル名は何なのでしょうか・・・
調べてみると、systemd の PrivateTmp が有効になっているかららしいですね。

もっとも /tmp をセッションファイルの保存先にするのは通常はないでしょう。

ということで便宜的に /var/www/sessions ディレクトリを作ります。

$ sudo mkdir /var/www/sessions
$ sudo chown -R apache:apache /var/www/sessions

そして、php.ini を編集して /var/www/sessions ディレクトリに書き込むように、session.save_path を変更します。

session.save_path = "/var/www/sessions"

最後に、Apache を再起動します。

sudo apachectl restart

再びブラウザーでアクセスすると、以下のように /var/www/sessions ディレクトリにセッションファイルが作成されているはずです。
sess_ の後ろの部分がセッション ID になっています。

$ ls -lt /var/www/sessions/
total 4
-rw-------. 1 apache apache 15  3月  3 13:30 sess_hck9fsfqbtvg47elrkia6iv50n

参考


  1. 最新の開発版では PHP のバージョンが 8 になっています。その影響で libs/libphp8.so となっているのですが、これでは Apache が認識してくれません。 

  2. ローカル環境なのでこうしましたが、本番環境ではちゃんと検討したほうがいいです、うん。 

  3. --enable-debug はデバッグを有効にするオプションです。--with-config-file-pathphp.ini の検索場所を指定するオプションで、複数バージョンを共存させたいので、あえて指定しています。 

11
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6