17
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

サムザップ #1Advent Calendar 2020

Day 6

M1 Macでarm64のHomebrewとPHPBrewでPHP8.0の環境作ってベンチながす

Last updated at Posted at 2020-12-04

本記事は、サムザップ Advent Calendar 2020 #1 の12/6の記事です。

※2021/1/12 追記:pharを有効でインストール可能に!

はじめに

MacBookAir(M1)でPHP8.0のベンチをとるはなしです

ただ、せっかくのApple Siliconなので、ARMネイティブのPHP8.0の環境をつくりたいとおもいます

M1 Macの開発環境のお話であれば、すでに@shibukawaさんの「M1 Macの開発環境」の記事があがっています

ですが、自分が慣れ親しんでいるHomebrewとPHPBrewの環境にこだわってみました

(ちなみに、HomebrewのApple Silicon対応は日々アップデートされ、改善されているので、この記事でエラーを回避している部分も、記事を読んでいただくタイミングでは解決済みかもしれません)

まずはHomebrew

Apple Siliconの場合 /opt/homebrew 配下にインストールします(推奨されている)

$ cd /opt
$ sudo mkdir homebrew
$ sudo chown $USER:admin homebrew
$ curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew

PATHを設定します

.zshrc

export PATH=/opt/homebrew/bin:/usr/local/bin:$PATH

つぎにPHPBrew

こちらも /opt/phpbrew 配下にインストールします

$ curl -L -O https://github.com/phpbrew/phpbrew/releases/latest/download/phpbrew.phar
$ chmod +x phpbrew.phar
$ sudo mkdir -p /opt/phpbrew
$ sudo chown $USER:admin /opt/phpbrew
$ sudo mkdir /opt/phpbrew/bin
$ mv phpbrew.phar /opt/phpbrew/bin/phpbrew

初期化

$ /opt/phpbrew/bin/phpbrew init --root=/opt/phpbrew

PATHを設定します

.zshrc

[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc

export PATH=/opt/homebrew/bin:/opt/phpbrew/bin:/usr/local/bin:$PATH

PHPのビルドに必要なライブラリのインストール

まず

$ xcode-select --install

次に、HomebrewをつかってPHPのビルドに必要なライブラリをインストールします

$ brew install curl mhash bzip2 oniguruma libzip libxml2 libiconv libxslt

PHP8.0のビルド!

次のエラーが回避できずvariantsの変更で対応しました

PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled.
make: *** [ext/phar/phar.phar] Bus error: 10

ーーー
※2021/1/12追記:解決
(phpenvでも同じエラーになるので、同様に--with-external-pcreを指定すれば解決します)

次のパッケージをbrewでいれて

$ brew install pcre2

オプションでpcreを指定

$ phpbrew install 8.0.0 +default +mysql -- --with-external-pcre=$(brew --prefix pcre2)

これでvariantsでpearとpharを除外しなくてもOKになります
ーーー

おまじないをして(xsltのエラーが出たので)、いざビルド

(variantsでpharとpearを除外しています)

$ export LDFLAGS="-L/opt/homebrew/opt/libxslt/lib"
$ export CPPFLAGS="-I/opt/homebrew/opt/libxslt/include"
$ export PKG_CONFIG_PATH="/opt/homebrew/opt/libxslt/lib/pkgconfig"
$ phpbrew install 8.0 +default -phar -pear

PHP8.0に切り替えて確認

$ phpbrew use php-8.0.0
$ php -v
PHP 8.0.0 (cli) (built: Dec  4 2020 01:10:49) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies

$ lipo -archs `which php`
arm64

ちゃんとPHP8.0になっているのとarm64でコンパイルされたのを確認できました!

いざベンチマーク

ベンチマークはこちらを使用

php/php-src

検証機は「MacBook Air 2020 M1」です

(1)まずは、MacにプリインストールされているPHP7.3.22から

$ php -v
WARNING: PHP is not recommended\nPHP is included in macOS for compatibility with legacy software.\nFuture versions of macOS will not include PHP.
PHP 7.3.22-(to be removed in future macOS) (cli) (built: Oct 30 2020 00:19:07) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.22, Copyright (c) 1998-2018 Zend Technologies

$ lipo -archs `which php`
x86_64 arm64e

ベンチ実行

$ php bench.php
simple             0.033
simplecall         0.009
simpleucall        0.020
simpleudcall       0.021
mandel             0.082
mandel2            0.092
ackermann(7)       0.020
ary(50000)         0.002
ary2(50000)        0.002
ary3(2000)         0.036
fibo(30)           0.073
hash1(50000)       0.005
hash2(500)         0.006
heapsort(20000)    0.020
matrix(20)         0.018
nestedloop(12)     0.046
sieve(30)          0.012
strcat(200000)     0.003
------------------------
Total              0.499

(2)つぎにPHP8.0(JIT オフ)

$ phpbrew use php-8.0.0
$ php -v
PHP 8.0.0 (cli) (built: Dec  4 2020 01:10:49) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies

$ lipo -archs `which php`
arm64

ベンチ実行

$ php bench.php 
simple             0.024
simplecall         0.006
simpleucall        0.018
simpleudcall       0.021
mandel             0.079
mandel2            0.084
ackermann(7)       0.019
ary(50000)         0.002
ary2(50000)        0.002
ary3(2000)         0.032
fibo(30)           0.071
hash1(50000)       0.004
hash2(500)         0.006
heapsort(20000)    0.018
matrix(20)         0.016
nestedloop(12)     0.031
sieve(30)          0.012
strcat(200000)     0.003
------------------------
Total              0.448

(3)最後にPHP8.0(JIT オン)

まずは JITをオンにする(参考「PHPBrewでPHP8を入れる」)

~/.phpbrew/php/php-8.0.0/etc/php.iniを編集

コメントをはずす

zend_extension=opcache

変更&追記

opcache.enable_cli=1
opcache.jit=on
opcache.jit_buffer_size=100M

JITがオンになったのを確認

ーーーー
2021/3/25 追記
確認方法が誤っていたので、正しい方法へ変更
ーーーー

$ php -v
PHP 8.0.0 (cli) (built: Dec  4 2020 01:10:49) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.0, Copyright (c), by Zend Technologies
$ php -i | grep jit
(ない)

$ lipo -archs `which php`
arm64

"with Zend OPcache v8.0.0" が表示されるようになりましたね
ただし、php -iでJITが有効になっているか確認すると、
ARMでは、JITを有効にできていませんでした
OPcacheだけ有効な状態です

ベンチ実行

$ php bench.php
simple             0.025
simplecall         0.010
simpleucall        0.009
simpleudcall       0.008
mandel             0.048
mandel2            0.070
ackermann(7)       0.018
ary(50000)         0.002
ary2(50000)        0.002
ary3(2000)         0.032
fibo(30)           0.060
hash1(50000)       0.004
hash2(500)         0.006
heapsort(20000)    0.016
matrix(20)         0.016
nestedloop(12)     0.031
sieve(30)          0.011
strcat(200000)     0.003
------------------------
Total              0.370

最後に

今回作った環境はとりあえずベンチマークをながすだけの環境になります

(phpbrewでPHP8.0に切り替えたあと、pharがないので、phpbrewコマンドが以降エラーになります)

正直ベンチマークの結果は、なんともいえず、まだPHP8.0のJITはARMよりもx86に最適化されているのかな?と思ってしまう結果でした
まだPHP8.0のJITはARMに対応されていませんでした

ただ、Apple SiliconのARMネイティブ環境を作るのは、なんだかワクワクしませんか?

(自分はワクワクしながら開発環境を整えています)

今回記事を書くにあたって、日々、Homebrewが改善されているくのを目の当たりにしました(昨日(12/2)までエラーが発生してインストールできないライブラリがいくつあったものの、今日(12/3)には改善されていました)

OSSの開発者の努力によって、Apple Siliconの開発環境は日々改善されています

感謝しかありません

この記事もみなさまのお役に少しでも立てたら幸いです

明日は@KoniroIrisの記事です!

17
8
3

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
17
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?