Mac

MacOS12へのアップデートでPHPがなくなったのでhomebrewでインストール

MacOSをMonterey(12.0)にバージョンアップしたらPHPがなくなってしまってインストールした覚え書き。ソースからのビルドではPHPの拡張モジュールの一部のインストールがうまくいかなかったので結局homebrewでインストールしました。

これまでは

もう17、8年くらい前の「パーソナルWeb共有」とかなんとかの頃からずっとそのままビルトインのApacheを利用してきました。ドキュメントルートを専用のストレージに置いたり多少カスタマイズはしてましたが、一人で使うローカル環境としてはこれで十分だったのです。

MacOSがBig Sur(11)?かなんかになってから、OSアップデートのたびにカスタマイズした httpd.conf が初期化されるようにになりました。

homebrewでApache2をインストール

  1. Apacheを一旦ストップ。自動起動も解除する。
    $ sudo apachectl stop
    $ sudo launchctl stop /System/Library/LaunchDaemons/org.apache.httpd.plist
    $ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist
    
  2. インストールにあたってエラーが出たのでhomebrewをアップデート。
    $ brew update
    アップデートでもエラーが出るのでエラー文に習ってコマンド実行後にアップデート
    参考:Homebrew で Error homebrew-core is a shallow clone が出て brew update が実行できない問題 | gotohayato.com
    その他、PHPインストールでのシンボリックリンクの作成などパーミッションの関係でエラーが出る場合は出力されたエラー文を参考にコマンド実行。
  3. インストール。珍しくなんのエラーも起きずに無事完了。今回インストールしたバージョンは2.4.51でした。
    $ brew install apache2
  4. インストール完了メッセージにあるパスを参考にターミナルのapachectlを新しいApache2に置き換え。ユーザーディレクトリにある「.bash_profile」のApacheのパスを書き換える。不可視ファイルなので、ターミナル上で編集するかファインダーで不可視ファイルを表示するか、それはまかせます。ファイルが無ければ作成。
    export PATH=/usr/local/Cellar/httpd/2.4.51/bin:${PATH}
  5. 一度ログアウトして、うまく反映されているか確認。
    $ which apachectl
    /usr/local/Cellar/httpd/2.4.51/bin/apachectl
  6. 新しくインストールしたApacheの設定ファイルを以下のような感じ(抜粋)で更新。ビルトイン、ソースからのビルド、homebrew、それぞれで設定ファイルの場所は違うので前のはとりあえずそのまま放置でOK。うちではhomebrew版は「/usr/local/etc/httpd/」に配置されてました。
    ...
    Listen 80
    ...
    ServerName localhost:80 # 設定しないと起動でエラー
    ...
    LoadModule include_module lib/httpd/modules/mod_include.so # SSI 有効
    ...
    DocumentRoot "/Volumes/Sites"
    <Directory "/Volumes/Sites">
    ...
  7. Apacheを起動してみると以下のようなエラーが出ました。
     $ sudo apachectl start
    dyld[67332]: Symbol not found: _apr_bucket_alloc_aligned_floor ...
    ググると以下のアップデートで治るみたいです。
     $ brew reinstall apr-util

homebrewでPHP7.4をインストール

  1. すでにPHPがインストールしてあったので一旦アンインストール。
     $ brew uninstall php
  2. PHP8はまだ対応できてないプロジェクトが多々あったので、とりあえず7.4入れました。
     $ brew install php@7.4
  3. Apacheの設定ファイル「httpd.conf」でPHPを有効に。モジュールのパスがややこしければApacheのモジュールディレクトリにシンボリックリンクを作成すると良いでしょう。
     $ n -s /usr/local/Cellar/php@7.4/7.4.25.reinstall/lib/httpd/modules/libphp7.so /usr/local/Cellar/httpd/2.4.51/lib/httpd/libphp7.so
    LoadModule php7_module lib/httpd/modules/libphp7.so

    以前のビルトインApacheにはこの行はコメントアウトで一応記載されてたけど、MontereyのApacheでは 注意書きに変更されてました。

    #PHP was deprecated in macOS 11 and removed from macOS 12
  4. Apacheを再起動。
     $ sudo apachectl restart

今回はとりあえずソースからのビルドは断念

ソースからのビルドでは、PHPの拡張モジュールのインストールにたくさんのエラーが起きてしまって、ひとつひとつ潰していくのに丸一日かかったうえ、手段を尽くしてもzlibやopenssl、sqlite3あたりにエラーが残ってしまったので腹たって断念しました。

Apache2のソースからのビルド

発生した主なエラー

本当はOS起動時にApacheが起動するよう LaunchDaemons の設定をしようと思っていたのですが、httpd.confに ServerName を設定するとうまく動かなかったのでこちらは一旦保留しました。まぁ何日も電源入れっぱなので実はそんなに困りません。

PHP7.4のソースからのビルド

発生した主なエラー
  1. configure では「あれがない」「これが古い」とエラー頻発。一部はhomebrewでインストール(以下例)。
    $ brew install pkg-config # パッケージが古いとかなんとか
    $ brew install libiconv # makefile がないとか
  2. extディレクトリに同梱されたモジュール(zlib、openssl、sqlite3とか)のインストール(以下例)でもエラー頻発。仮にインストールできても configure オプションをつけるとエラーが起きる。
    $ cd ~/php-7.4.25/ext/zlib
    $ phpize #モジュールのビルド環境を準備
    $ ./configure --prefix=/usr/local
    $ make
    $ sudo make install
    ...
    Installing shared extensions:   /usr/local/lib/php/extensions/no-debug-zts-20190902/

    場合によっては php.iniのDynamic Extensions に .so ファイルのパスを追加する。
    ;;;;;;;;;;;;;;;;;;;;;;
    ; Dynamic Extensions ;
    ;;;;;;;;;;;;;;;;;;;;;;
    ...
    extension=mbstring
  3. あまりにもエラーが起きるので configure オプションでエラーの起きるモジュールを省略してインストールすると、実際の動作で Fatal error 続出。オプションはヘルプで確認。
    $ ./configure --help
  4. mysqlでもエラー、ググってmysqlのパスを通して最終的にはこちらは利用可能にした。

まぁ、なんとかPHPが使えるようになって良かったです。
よく使っているさくらのレンタルサーバではすでにPHP8が使えるようになっているので、今後はエラー潰ししながら徐々にPHP8に移行していこうと思います。