【PHP】PHPからApacheのバージョンを取得する


PHP から Apache のバージョンを取得する方法についての記事です。


コード

function apacheVersion($pShell = null)
{
    //-- Apacheのバージョンを取得するためのコマンド
    $shell = (isset($pShell)) ? $pShell
                              : 'apachectl -v';

    //-- Apacheのバージョンを取得するための正規表現
    $regex = '/Apache\/(\d{1,2}\.\d{1,2}\.\d{1,2})/';

    switch(true) {
        //-- 1.環境変数からの取得を試みる
        case (preg_match($regex, getenv('SERVER_SOFTWARE'), $matchAry)):

        //-- 2.apache_get_version()での取得を試みる
        case (function_exists('apache_get_version') && preg_match($regex, apache_get_version(), $matchAry)):

        //-- 3.コマンドでの取得を試みる
        case (preg_match($regex, shell_exec($shell), $matchAry)):
            return $matchAry[1];

        //-- バージョン取得失敗
        default:
            return false;
    }
}

使い方

$version = apacheVersion();    // string(6) "2.4.39"

//-- Apacheをソースからビルドした環境やWindows環境等で
//-- Apacheのバージョンを取得するコマンドを指定したい時
apacheVersion('C:\apache\bin\httpd.exe -v');

なぜ三段構えになっているか

1.環境変数からの取得を試みる

この方法では、例えば PHP を CLI 版で動作させている時は取得できません。('SERVER_SOFTWARE' は定義されません。)

また、この方法で取得できるのは、Apache の ServerTokens の設定が、Full OS Minimal の時のみです。

公開環境では Prod を設定し、HTTP ヘッダに Apache のバージョンが公開されないようにするのが普通です。

ServerTokens Prod

この設定の場合、getenv('SERVER_SOFTWARE') には 'Apache' という文字列しか入りませんので、バージョンを取得する事はできません。

2.apache_get_version()での取得を試みる

この関数で取得できる値は、基本的に 1 と同じです。

つまり、あまり実用性のない関数だというのが個人的な認識ですが、1 で失敗しても 2 で成功するケースがあるのかもしれないので、念の為に書いています。

3.コマンドでの取得を試みる

…というわけで、最終手段として Apache に直接聞いちゃえ!って事です。