PHPbrewで執筆時点で最新版のPHP8.2.8をインストールしました。以前に7.3.33をインストールしていたので、今回2バージョン目になります。複数バージョンの切り替えもしてみました。
もくじ
WordPresプラグインを最新PHPに対応させたかった
以前、以下の二つの記事で説明した方法でWordPressの環境構築をし、PHP7.3.33をインストールしています。
この状況で、開発しているWordPressプラグインを最新版PHPに対応させるために8.2.8をインストールすることにしました。
どのバージョンが最新か調べる
1 2 3 4 |
$ phpbrew known Read local release list (last update: 2023-06-01 08:34:33 UTC). You can run `phpbrew update` or `phpbrew known --update` to get a newer release list. 8.2: 8.2.6, 8.2.5, 8.2.4, 8.2.3, 8.2.2, 8.2.1, 8.2.0 ... |
8.2系は8.2.6が最新と表示されました。
ただ、どうやらこれは以前に取得した情報を表示しているだけなので、更新する必要があリます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ phpbrew update ===> Fetching release list... Downloading https://www.php.net/releases/index.php?json=1&version=8&max=100 via curl extension Downloading https://www.php.net/releases/index.php?json=1&version=7&max=100 via curl extension 8.2: 9 releases 8.1: 22 releases 8.0: 29 releases 7.4: 32 releases 7.3: 34 releases 7.2: 22 releases 7.1: 10 releases 7.0: 2 releases ===> Done |
updateとすると、phpbrewのプログラム自体が最新化されるのかな、って思いますが、そうではなくてPHPのバージョンのrelease情報を更新してくれるということです。
1 2 3 4 |
$ phpbrew known Read local release list (last update: 2023-07-17 06:21:26 UTC). You can run `phpbrew update` or `phpbrew known --update` to get a newer release list. 8.2: 8.2.8, 8.2.7, 8.2.6, 8.2.5, 8.2.4, 8.2.3, 8.2.2, 8.2.1 ... |
すると、8.2.8が最新ということがわかりました。
意外とすぐにインストールできた
結論から言うと、以下でインストールできました。
1 |
$ phpbrew install 8.2.8 +default +mysql +apxs2="$(which apxs)" +openssl=/opt/homebrew/opt/openssl@1.1 |
opensslの指定
ただ、一つぶつかった点があります。
最初、 +openssl=/opt/homebrew/opt/openssl@1.1 という部分をつけていませんでした。実行すると、以下のようなエラーが出ました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Error: Make failed: The last 5 lines in the log file: "_SSL_get1_peer_certificate", referenced from: _php_openssl_sockop_set_option in xp_ssl.o ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [libs/libphp8.1.21.bundle] Error 1 Please checkout the build log file for more details: tail /Users/xxxx/.phpbrew/build/php-8.1.21/build.log |
最後の行にログの所在が書かれてるので、これを開いてみると、最後の方に以下が出力されていました。
この状態でも、不思議なのは以下のようにPHPbrewによるとインストールされたことになってるんですよね。
1 2 3 |
$ phpbrew list php-8.2.8 * php-7.3.33 |
まぁ、でもちゃんとエラーがなくならないときちんと動くか心配なので対応を調査しました。先ほどのエラーの出力の最後にログの場所が記載されていたので、それを開くと下の方に以下の出力がありました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
Undefined symbols for architecture arm64: "_EVP_CIPHER_CTX_get_block_size", referenced from: _zif_openssl_seal in openssl.o "_EVP_CIPHER_do_all_provided", referenced from: _zif_openssl_get_cipher_methods in openssl.o "_EVP_CIPHER_get0_name", referenced from: _php_openssl_add_cipher in openssl.o "_EVP_CIPHER_get_block_size", referenced from: _php_openssl_cipher_update in openssl.o "_EVP_CIPHER_get_iv_length", referenced from: _zif_openssl_seal in openssl.o _zif_openssl_open in openssl.o _php_openssl_cipher_init in openssl.o _php_openssl_cipher_iv_length in openssl.o _zif_openssl_cipher_iv_length in openssl.o "_EVP_CIPHER_get_key_length", referenced from: _php_openssl_cipher_init in openssl.o _php_openssl_cipher_key_length in openssl.o _zif_openssl_cipher_key_length in openssl.o "_EVP_CIPHER_get_mode", referenced from: _php_openssl_encrypt in openssl.o _php_openssl_decrypt in openssl.o "_EVP_CIPHER_get_nid", referenced from: _php_openssl_encrypt in openssl.o _php_openssl_decrypt in openssl.o "_EVP_CIPHER_names_do_all", referenced from: _php_openssl_add_cipher_or_alias in openssl.o "_EVP_MD_get_size", referenced from: _zif_openssl_digest in openssl.o "_EVP_PKEY_CTX_set_dh_paramgen_prime_len", referenced from: _php_openssl_generate_private_key in openssl.o "_EVP_PKEY_CTX_set_dsa_paramgen_bits", referenced from: _php_openssl_generate_private_key in openssl.o "_EVP_PKEY_CTX_set_ec_param_enc", referenced from: _php_openssl_generate_private_key in openssl.o "_EVP_PKEY_CTX_set_ec_paramgen_curve_nid", referenced from: _php_openssl_generate_private_key in openssl.o "_EVP_PKEY_CTX_set_rsa_keygen_bits", referenced from: _php_openssl_generate_private_key in openssl.o "_EVP_PKEY_CTX_set_rsa_padding", referenced from: _zif_openssl_private_encrypt in openssl.o _zif_openssl_private_decrypt in openssl.o _zif_openssl_public_encrypt in openssl.o _zif_openssl_public_decrypt in openssl.o _mysqlnd_caching_sha2_handle_server_response in mysqlnd_auth.o _mysqlnd_sha256_auth_get_auth_data in mysqlnd_auth.o "_EVP_PKEY_fromdata", referenced from: _zif_openssl_pkey_new in openssl.o "_EVP_PKEY_fromdata_init", referenced from: _zif_openssl_pkey_new in openssl.o "_EVP_PKEY_get_base_id", referenced from: _zif_openssl_pkey_get_details in openssl.o _zif_openssl_dh_compute_key in openssl.o "_EVP_PKEY_get_bits", referenced from: _zif_openssl_pkey_get_details in openssl.o "_EVP_PKEY_get_bn_param", referenced from: _php_openssl_copy_bn_param in openssl.o "_EVP_PKEY_get_size", referenced from: _zif_openssl_sign in openssl.o _zif_openssl_seal in openssl.o _phar_create_signature in util.o _mysqlnd_caching_sha2_handle_server_response in mysqlnd_auth.o _mysqlnd_sha256_auth_get_auth_data in mysqlnd_auth.o "_EVP_PKEY_get_utf8_string_param", referenced from: _zif_openssl_pkey_get_details in openssl.o "_EVP_PKEY_set1_encoded_public_key", referenced from: _zif_openssl_dh_compute_key in openssl.o "_OSSL_PARAM_BLD_free", referenced from: _zif_openssl_pkey_new in openssl.o "_OSSL_PARAM_BLD_new", referenced from: _zif_openssl_pkey_new in openssl.o "_OSSL_PARAM_BLD_push_BN", referenced from: _zif_openssl_pkey_new in openssl.o "_OSSL_PARAM_BLD_push_octet_string", referenced from: _zif_openssl_pkey_new in openssl.o "_OSSL_PARAM_BLD_push_utf8_string", referenced from: _zif_openssl_pkey_new in openssl.o "_OSSL_PARAM_BLD_to_param", referenced from: _zif_openssl_pkey_new in openssl.o "_OSSL_PARAM_free", referenced from: _zif_openssl_pkey_new in openssl.o "_SSL_CTX_set0_tmp_dh_pkey", referenced from: _php_openssl_setup_crypto in xp_ssl.o "_SSL_get1_peer_certificate", referenced from: _php_openssl_sockop_set_option in xp_ssl.o ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [libs/libphp8.2.8.bundle] Error 1 |
調べていくと、以下の記事に似た出力が記載されていました。
PHP compile fails with undefined symbols for architecture x86_64, libiconv on macOS Sierra
この記事はlibionvというソフトウェアの指定に関するエラーですが、私のはそれに相当するのがopensslというソフトウェアです。
これはPHP7.3.33をインストールした時にもしたのですが、opensslのパスを指定するのを思い付きました。
で、opensslはいくつかバージョンがあるのでどのバージョンが対応しているのが調べました。以下によると7.3.33と同じく、1.1に対応していることがわかりました。
+openssl=/opt/homebrew/opt/openssl@1.1 をつけてうまく上記のエラーは出なくなり、正常にインストールできました。ちなみに、インストール失敗した後に、アンインストールせずに、重ねてインストールしました。それでも正常にインストールできました。
apxsの指定の仕方
なお、 +apxs2="$(which apxs)" という部分、7.3.33の時は、 +apxs2=/opt/homebrew/bin/apxs とパスを指定していましが、今回のようにして短くすることができました。
+debugは要らない
7.3.33の時はXdebugを使うには +debug というオプションをつけなければならないと何となく思っていましたが、今回はこれをつけずにやってみました。その結果このオプションをつけなくても、Xdebugをインストールしたら普通に使えることがわかりました。
ちなみに、このオプションをつけるかどうかで何が違うのかいまいちわからないのですが、以下のように、拡張機能が配置されるディレクトリの名前が違うことはわかりました。
/Users/xxxxx/.phpbrew/php/php-8.2.8/lib/php/extensions/no-debug-non-zts-20220829
/Users/xxxxx/.phpbrew/php/php-7.3.33/lib/php/extensions/debug-non-zts-20180731
no-debug-non-zts-20220829とdebug-non-zts-20180731の違いです。
これ以外に実質的な違いがあるのかたくさん調べたのですが、ほとんど情報が出てきません。以下のページによると、mysqlnd.debugという機能はこのオプションが無いと使えないとあります。
Apacheでのバージョンの切り替え方法
コマンドラインで使うPHPのバージョンの切り替えは、PHPbrewを使えばワンコマンドで簡単にできます。
心配していたのはApacheでのバージョンの切り替えです。WordPressで動かすにはApacheから使われるPHPのバージョンを切り替える必要があります。
先ほどPHPがインストール完了した段階で、httpd.confに一行追記されます。フルパスで言うと
/opt/homebrew/etc/httpd/httpd.conf
です。以下は抜粋ですが、ここでいうところの2行目が自動的に追記されます。
1 2 |
LoadModule php7_module /opt/homebrew/lib/httpd/modules/libphp7.3.33.so LoadModule php_module /opt/homebrew/lib/httpd/modules/libphp8.2.8.so |
これだと、どちらのバージョンが使われるかわからないので、8.2.8を使いたい場合は、上で言うところの1行目をコメントアウトします。つまり、行頭に # を付与します。
これでApacheを再起動すれば、8.2.8が有効になります。
なお、言うまでもないですが、インストールした段階で /opt/homebrew/lib/httpd/modules/ に libphp8.2.8.so が自動的に配置されています。
今後、都度バージョンを切り替えるには、このhttpd.confで使わないバージョンの行にコメントアウトを付け替えて、Apache再起動でできるということです。
Xdebugをインストールして使う
やり方は以下の7.3.33でやった方法と同じです。
ただ、今回は最新版PHPだけあって、Xdebugのバージョンを指定する必要はありませんでした。
1 |
$ phpbrew ext install xdebug |
設定のiniファイルは7.3.33の時に作成したものをそのままコピーしてくることでOKでした。
1 |
$ cp ~/.phpbrew/php/php-7.3.33/var/db/apache2/99-xdebug.ini ~/.phpbrew/php/php-8.2.8/var/db/apache2/ |
これでApache再起動すれば8.2.8でXdebugを使えます。
さいごに
インストール時に少しエラーは出ましたが、7.3.33で体験したことが活きてすぐに解決できました。切り替え方法も簡単なので、たくさんのバージョンをインストールしておき、それぞれ検証するのも簡単そうです。