macOSで、PHPをソースからビルド、Apacheと連携する

主題
macOSで、PHPをソースからビルド、Apacheと連携する手順を述べる。(最終更新日:2024.12.20)

背景
Big Surになって融通の効かなくなった、OSビルトインのApache Webサーバーの代わりに、別のApache Webサーバーを導入した。
せっかくなので、PHPを導入し、Apacheから使えるようにすることにした。なお、PHPを自前ビルドした理由は、OSビルトインのPHPをバージョン確認すると、将来削除するで〜と警告するせいでもある。(macOS 13 Venturaで削除された)

手順

  1. Apacheのコンパイルとインストール
    当然のことだが、Apacheは導入済みとして話を進める。未導入の場合は、この記事に沿って導入されたい。

  2. PHP導入に必要な項目のコンパイルとインストール

    1. Clangの警告をなくすおまじない(SDKのバージョンは筆者の例)

      export CFLAGS="-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk"
      export CXXFLAGS="-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk"
    2. pkg-configのコンパイル&インストール

      curl -LO https://pkg-config.freedesktop.org/releases/pkg-config-0.29.2.tar.gz
      tar xf pkg-config-0.29.2.tar.gz
      cd pkg-config-0.29.2
      ./configure --with-internal-glib
      make
      sudo make install
    3. cmakeのコンパイルとインストール(更新)

      curl -LO https://github.com/Kitware/CMake/releases/download/v3.31.2/cmake-3.31.2.tar.gz
      tar xf cmake-3.31.2.tar.gz
      cd cmake-3.31.2
      rm Modules/FindJava.cmake
      curl -OJL "https://docs.google.com/uc?export=download&id=0B2uOKVwFe1AXU1QzdXlvc0VRSEU"
      patch -p1 < cmake_CMakeLists.patch
      ./bootstrap; make; sudo make install

      JRE, JDKが入っている環境では、4-6行目の作業は必要ない。

    4. OpenSSLのコンパイルとインストール

      curl -LO https://github.com/openssl/openssl/releases/download/openssl-3.4.0/openssl-3.4.0.tar.gz
      tar xf openssl-3.4.0.tar.gz
      cd openssl-3.4.0
      ./config --openssldir=/usr/local/ssl
      make && sudo make install
    5. GNU bisonのコンパイルとインストール

      curl -LO https://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.xz
      tar xf bison-3.8.2.tar.xz
      cd bison-3.8.2
      ./configure --prefix=/usr/local/gnu_bison
      make
      sudo make install
    6. re2cのコンパイルとインストール(更新)

      curl -LO https://github.com/skvadrik/re2c/releases/download/4.0.2/re2c-4.0.2.tar.xz
      tar xf re2c-4.0.2.tar.xz
      cd re2c-4.0.2
      ./configure --prefix=/usr/local/re2c
      make
      sudo make install
      sudo ln -s /usr/local/re2c/bin/re2c /usr/local/bin/re2c
    7. libxml2のコンパイルとインストール(更新)

      curl -LO https://download.gnome.org/sources/libxml2/2.13/libxml2-2.13.5.tar.xz
      tar xf libxml2-2.13.5.tar.xz
      cd libxml2-2.13.5
      ./configure --prefix=/usr/local/libxml2 --without-python
      make
      sudo make install
      sudo ln -s /usr/local/libxml2/lib/pkgconfig/libxml-2.0.pc /usr/local/lib/pkgconfig/libxml-2.0.pc
    8. SQLite3のコンパイルとインストール(更新)

      curl -LO https://www.sqlite.org/2024/sqlite-autoconf-3470200.tar.gz
      tar xf sqlite-autoconf-3470200.tar.gz
      cd sqlite-autoconf-3470200
      ./configure --prefix=/usr/local/sqlite3
      make
      sudo make install
      sudo ln -s /usr/local/sqlite3/lib/pkgconfig/sqlite3.pc /usr/local/lib/pkgconfig/sqlite3.pc
    9. libpslのコンパイルとインストール

      curl -LO https://github.com/rockdaboot/libpsl/releases/download/0.21.5/libpsl-0.21.5.tar.gz
      tar xf libpsl-0.21.5.tar.gz
      cd libpsl-0.21.5
      ./configure
      make
      sudo make install
    10. OpenLDAPのコンパイルとインストール(更新)
      phpのコンフィギュア時にエラーになるので、導入する。

      curl -LO https://www.openldap.org/software/download/OpenLDAP/openldap-release/openldap-2.6.9.tgz
      tar xf openldap-2.6.9.tgz
      cd openldap-2.6.9
      ./configure --prefix=/usr/local/openldap --sysconfdir=/usr/local/etc --localstatedir=/usr/local/var --enable-accesslog --enable-auditlog --enable-constraint --enable-dds --enable-deref --enable-dyngroup --enable-dynlist --enable-memberof --enable-ppolicy --enable-proxycache --enable-refint --enable-retcode --enable-seqmod --enable-translucent --enable-unique --enable-valsort --without-systemd
      make depend
      make SOELIM=mandoc_soelim
      sudo make install SOELIM=mandoc_soelim
      sudo ln -s /usr/local/openldap/lib/pkgconfig/ldap.pc /usr/local/lib/pkgconfig/ldap.pc
      sudo ln -s /usr/local/openldap/lib/pkgconfig/lber.pc /usr/local/lib/pkgconfig/lber.pc
    11. libcurlのコンパイルとインストール(更新)
      libpsl、ldapはlibcurlの依存ライブラリである。

      curl -LO https://curl.se/download/curl-8.11.1.tar.xz
      tar xf curl-8.11.1.tar.xz
      cd curl-8.11.1
      ./configure --prefix=/usr/local/curl --with-openssl
      make
      sudo make install
      sudo ln -s /usr/local/curl/lib/pkgconfig/libcurl.pc /usr/local/lib/pkgconfig/libcurl.pc
    12. libiconvのコンパイルとインストール(更新)

      curl -LO https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.18.tar.gz
      tar xf libiconv-1.18.tar.gz
      cd libiconv-1.18
      ./configure --prefix=/usr/local/libiconv
      make
      sudo make install
    13. onigurumaのコンパイルとインストール

      curl -LO https://github.com/kkos/oniguruma/releases/download/v6.9.9/onig-6.9.9.tar.gz
      tar xf onig-6.9.9.tar.gz
      cd onig-6.9.9
      ./configure --prefix=/usr/local/oniguruma
      make
      sudo make install
      sudo ln -s /usr/local/oniguruma/lib/pkgconfig/oniguruma.pc /usr/local/lib/pkgconfig/oniguruma.pc
    14. libjpegのコンパイルとインストール

      curl -LO https://www.ijg.org/files/jpegsrc.v9f.tar.gz
      tar xf jpegsrc.v9f.tar.gz
      cd jpeg-9f
      ./configure --prefix=/usr/local/jpeg
      make
      sudo make install
      sudo ln -s /usr/local/jpeg/lib/pkgconfig/libjpeg.pc /usr/local/lib/pkgconfig/libjpeg.pc
    15. libpngのコンパイルとインストール

      curl -LO https://download.sourceforge.net/libpng/libpng-1.6.44.tar.xz
      tar xf libpng-1.6.44.tar.xz
      cd libpng-1.6.44
      ./configure --prefix=/usr/local/libpng
      make
      sudo make install
      sudo ln -s /usr/local/libpng/lib/pkgconfig/libpng.pc /usr/local/lib/pkgconfig/libpng.pc
      sudo ln -s /usr/local/libpng/lib/pkgconfig/libpng16.pc /usr/local/lib/pkgconfig/libpng16.pc
    16. libzipのコンパイルとインストール

      curl -LO https://libzip.org/download/libzip-1.11.2.tar.xz
      tar xf libzip-1.11.2.tar.xz
      cd libzip-1.11.2
      mkdir build
      cd build
      cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/libzip
      make
      sudo make install
      sudo ln -s /usr/local/libzip/lib/pkgconfig/libzip.pc /usr/local/lib/pkgconfig/libzip.pc
    17. zlibのコンパイルとインストール

      curl -LO https://www.zlib.net/zlib-1.3.1.tar.xz
      tar xf zlib-1.3.1.tar.xz
      cd zlib-1.3.1
      ./configure
      make test
      sudo make install
  3. PHPのコンパイルとインストール(更新)

    curl -LO https://www.php.net/distributions/php-8.4.1.tar.xz
    tar xf php-8.4.1.tar.xz
    cd php-8.4.1
    ./configure --prefix=/usr/local/php \
    --enable-cli \
    --enable-mbstring \
    --enable-xml \
    --enable-fpm \
    --enable-ftp \
    --enable-exif \
    --enable-fileinfo \
    --enable-gd \
    --enable-pcntl \
    --enable-pdo \
    --with-curl \
    --with-curl=/usr \
    --with-jpeg \
    --with-openssl \
    --with-iconv=/usr/local/libiconv \
    --with-apxs2=/usr/local/apache2/bin/apxs \
    --with-mysqli \
    --with-pdo-mysql \
    --with-zip \
    --with-zlib
    make
    cd libs
    install_name_tool -change "@rpath/libzip.5.dylib" \
    "/usr/local/libzip/lib/libzip.5.dylib" \
    libphp.so
    cd ../
    sudo apachectl stop
    sudo make install
    sudo ln -s /usr/local/php/bin/php /usr/local/bin/php

    PHPインストールの段階でapacheを止めておく。止めないでlibphp.soを入れ替えると、apachectlコマンドを実行した時に、apachectl: line 79: xxxxx Killed: 9や、httpd: Syntax error(Library not loaded:)というエラーが出る

  4. php.iniのコピー、設定および設置
    phpの初期設定ファイルphp.iniは、ダウンロードしたソースコードフォルダphp-8.3.13直下にphp.ini-developmentおよびphp.ini-productionというファイル名で入っている。どちらかを選んでコピー、php.iniにリネームの上、以下のように設置する。(この設置場所はphp –iniを実行すると表示されるものに合わせている)

    sudo cp -p php.ini /usr/local/php/lib

    設置前、つまりコピー&リネームした段階で、ファイルをテキストエディタで開き、PHP7.4 ぼくのかんがえたさいきょうのphp.iniを参照して編集すること。

  5. Apache側の設定(Apacheのhttpd.confにPHPを設定)
    PHPインストールによって、libphp.soは、/usr/local/apache2/modulesにコピーされ、httpd.confにもロードされるように書き込まれる。これを含めてhttpd.confを変更する方法と、PHPについての設定ファイルを作成、httpd.confに読み込ませる方法のどちらかを好みで使用されたい。

    1. httpd.confを変更する方法。変更をdiff形式で示す。

      vim /usr/local/apache2/conf/httpd.conf
      diff -u httpd.conf.bak httpd.conf
      --- httpd.conf.bak	2021-07-18 17:03:59.000000000 +0900
      +++ httpd.conf	2021-07-18 17:03:59.000000000 +0900
      @@ -163,6 +163,7 @@
       LoadModule userdir_module modules/mod_userdir.so
       LoadModule alias_module modules/mod_alias.so
       #LoadModule rewrite_module modules/mod_rewrite.so
      +LoadModule php_module        modules/libphp.so
      
       <IfModule unixd_module>
       #
      @@ -262,9 +263,13 @@
       # is requested.
       #
       <IfModule dir_module>
      -    DirectoryIndex index.html
      +    DirectoryIndex index.php index.html
       </IfModule>
      
      +<FilesMatch \.php$>
      +    SetHandler application/x-httpd-php
      +</FilesMatch>
      +
       #
       # The following lines prevent .htaccess and .htpasswd files from being 
       # viewed by Web clients. 
    2. PHP用設定ファイルを用意し、httpd.confに読み込ませる方法

      1. 共有オブジェクトファイルの準備

        cd php-8.4.1/libs
        sudo mkdir -p /usr/local/php/lib/httpd/modules
        sudo cp -p libphp.so /usr/local/php/lib/httpd/modules
      2. PHP用設定ファイル(php.conf)

        sudo vim /usr/local/apache2/conf/extra/php.conf
        # httpd.confにphpをincludeする設定ファイル
        #
        # PHPの場所 : /usr/local/bin/php
        # 対象バージョン : PHP 8.4.1 (cli) (built: Dec 20 2024 01:21:34) (ZTS)
        #
        # これ↓をhttpd.confに追記する
        #Include /usr/local/apache2/conf/extra/php.conf
        
        #
        # AddType allows you to add to or override the MIME configuration
        # file specified in TypesConfig for specific file types.
        #
        AddType application/x-httpd-php .php
        
        #
        # Dynamic Shared Object (DSO) Support
        #
        # To be able to use the functionality of a module which was built as a DSO you
        # have to place corresponding `LoadModule' lines at this location so the
        # directives contained in it are actually available _before_ they are used.
        # Statically compiled modules (those listed by `httpd -l') do not need
        # to be loaded here.
        #
        LoadModule php_module /usr/local/php/lib/httpd/modules/libphp.so
        
        #
        # DirectoryIndex: sets the file that Apache will serve if a directory
        # is requested.
        #
        <IfModule dir_module>
            DirectoryIndex index.php
        </IfModule>
        
        #
        # php.iniの場所
        #
        PHPIniDir "/usr/local/php/lib/php.ini"
      3. httpd.confの読み込み設定。変更をdiff形式で示す。

        sudo vim /usr/local/apache2/conf/httpd.conf
        diff -u httpd.conf.bak httpd.conf
        --- httpd.conf.bak	2021-07-19 12:34:39.000000000 +0900
        +++ httpd.conf	2021-07-19 12:46:56.000000000 +0900
        @@ -163,6 +163,7 @@
        LoadModule userdir_module modules/mod_userdir.so
        LoadModule alias_module modules/mod_alias.so
        #LoadModule rewrite_module modules/mod_rewrite.so
        -LoadModule php_module         modules/libphp.so
        +#LoadModule php_module         modules/libphp.so
        
        <IfModule unixd_module>
        #
        @@ -517,5 +518,5 @@
        SSLRandomSeed connect builtin
        </IfModule>
        
        +Include /usr/local/apache2/conf/extra/php.conf
        
  6. Apacheの起動

    sudo apachectl start
  7. Apacheとphpの連携確認

    echo "<?php phpinfo();?>" > ~/Sites/info.php

    ブラウザのアドレス欄にhttp://localhost/~user_name/info.phpと入力(user_nameは、ご自身のログイン名に変える)し、PHPの情報が表示されるのを確認する。

参考サイト

以上。

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL