Ubuntu 20.10 に PHP 8.0.1 をインストールして Symfony CLI を使う

公開:2021/01/30
更新:2021/01/31
12 min読了の目安(約10800字TECH技術記事

いつ書いた? 2021/01/31 [WIP]
いつWIP外した? 2021/01/31 14:56

https://zenn.dev/chatii/articles/c464eae220334c

前記事で Symfony CLI が anyenv & phpenv に対応していなさそうなことがわかりました
Parallels Desktop for Mac with Apple M1 chip (Apple Silicon) をインストールし Ubuntu Server for ARM 20.10 で PHP を動かそうと思います

目的は Symfony 5 The Fast Track の作業環境整備を終えることです

https://symfony.com/doc/current/the-fast-track/ja/1-tools.html
余談 Parallels Tools が ARM に対応していない

執筆時点(2021/01/30)では Parallels Tools をインストールしようとすると aarch64 はサポートしていない とメッセージがでます
ホストOSとのファイル共有も、クリップボード共有もできず、長いコマンドをいちいち打たなければならないのか…と思いましたが、ひらめきました
Ubuntu 内の Firefox で 本記事の下書きのプレビューを開くことでクリップボードの代わりとしました

phpenv のインストール

anyenv による phpenv だと問題が発生すると推測し、今回は phpenv 単体をまずインストールします
phpenv-installer を使えば簡単に導入できました

https://github.com/phpenv/phpenv-installer
余談 `.bash_profile` が読み込まれない

phpenv インストール後、パスを通すために .bash_profile を作って記述していましたが exec $SHELL -l してもパスが通りませんでした
原因はホームディレクトリにある .profile.bashrc は読み込むけれど .bash_profile についての処理は無かったことのようです

.profile は Ubuntu のデフォルトのままにしたかったので .bashrc にパスを通すコマンドを追記しました
厳密には .bash_profile.bashrc の役割/意味は異なります。おそらくスジとしては .profile にパスを通すコマンドを追記するべきと思います

あまり自信はないです。なぜ Ubuntu が .bash_profile を用意していない/読み込まないのかについて、識者の方のコメントがほしいところ

まずは前記事と同じオプションで PHP をビルドを試す

前記事のインストールコマンドは macOS 用なので brew などの macOS 向けのものを取り除いて叩いてみます

macOS 用

PHP_BUILD_CONFIGURE_OPTS="--with-bz2=$(brew --prefix bzip2) --with-iconv=$(brew --prefix libiconv) --with-tidy=$(brew --prefix tidy-html5) --with-external-pcre=$(brew --prefix pcre2) --with-sodium --with-zip --enable-intl --with-pdo-pgsql=$(brew --prefix postgresql) --with-pear" \
PHP_BUILD_EXTRA_MAKE_ARGUMENTS="-j$(sysctl -n hw.logicalcpu_max)" \
phpenv install --ini development 8.0.1

macOS 用を取り除いたもの

PHP_BUILD_CONFIGURE_OPTS="--with-bz2 --with-iconv --with-tidy --with-external-pcre --with-sodium --with-zip --enable-intl --with-pdo-pgsql --with-pear" \
PHP_BUILD_EXTRA_MAKE_ARGUMENTS="-j$(grep processor /proc/cpuinfo | wc -l)" \
phpenv install --ini development 8.0.1

(CPU論理コア数を取得するところは書換えました)

これを実行して、不足しているライブラリ等を確認しつつインストールしていきます

不足ライブラリ/パッケージのインストール

sudo apt-get install -y build-essential
sudo apt-get install -y libxml2-dev
sudo apt-get install -y libssl-dev
sudo apt-get install -y libpcre2-dev
sudo apt-get install -y libsqlite3-dev
sudo apt-get install -y zlib1g-dev
sudo apt-get install -y libbz2-dev
sudo apt-get install -y libcurl4-openssl-dev
sudo apt-get install -y libpng-dev
sudo apt-get install -y libjpeg-dev
sudo apt-get install -y libonig-dev
sudo apt-get install -y libpq-dev
sudo apt-get install -y libreadline-dev
sudo apt-get install -y libsodium-dev
sudo apt-get install -y libtidy-dev
sudo apt-get install -y libxslt-dev
sudo apt-get install -y libzip-dev
sudo apt-get install -y autoconf
1行で
sudo apt-get install -y build-essential libxml2-dev libssl-dev libpcre2-dev libsqlite3-dev zlib1g-dev libbz2-dev libcurl4-openssl-dev libpng-dev libjpeg-dev libonig-dev libpq-dev libreadline-dev libsodium-dev libtidy-dev libxslt-dev libzip-dev autoconf

ビルド/インストール

(前掲と変わらず)

PHP_BUILD_CONFIGURE_OPTS="--with-bz2 --with-iconv --with-tidy --with-external-pcre --with-sodium --with-zip --enable-intl --with-pdo-pgsql --with-pear" \
PHP_BUILD_EXTRA_MAKE_ARGUMENTS="-j$(grep processor /proc/cpuinfo | wc -l)" \
phpenv install --ini development 8.0.1
後から気付いた Pear の導入で ~躓いてる~ 躓いていた内容

Pear も前記事と同様に
pecl.php.net に接続できなかったので原因を調べたところ php.iniopenssl.cafile = /etc/ssl/certs/ca-certificates.crt と設定してみました

pecl channel-update pecl.php.net

// それでもできない
// 前記事で出来ていたはずのホストマシンでもできなくなっているので pecl.php.net の問題のように思えました

2021/01/31 13:29 追記
pecl.php.net が落ちてただけだったみたい…?

2021/01/31 13:38 追記
やはりインストールできないので -vvv を付けて詳細を確認します

pecl -vvv install redis

Warning: fsockopen(): SSL operation failed with code 1. OpenSSL Error messages:
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in PEAR/Proxy.php on line 183

Warning: fsockopen(): Failed to enable crypto in PEAR/Proxy.php on line 183

Warning: fsockopen(): Unable to connect to ssl://pecl.php.net:443 (Unknown error) in PEAR/Proxy.php on line 183
No releases available for package "pecl.php.net/redis"
Cannot initialize 'channel://pecl.php.net/redis', invalid or missing package file
Package "channel://pecl.php.net/redis" is not valid
install failed

下記の stackoverflow に行き着いたので、参考にして対応します
https://stackoverflow.com/questions/54339278/pecl-install-always-failed-unable-to-connect-to-ssl-pecl-php-net443-unknown

php -r "print_r(openssl_get_cert_locations());"
Array
(
    [default_cert_file] => /usr/lib/ssl/cert.pem
    [default_cert_file_env] => SSL_CERT_FILE
    [default_cert_dir] => /usr/lib/ssl/certs
    [default_cert_dir_env] => SSL_CERT_DIR
    [default_private_dir] => /usr/lib/ssl/private
    [default_default_cert_area] => /usr/lib/ssl
    [ini_cafile] => 
    [ini_capath] => /etc/ssl/certs/ca-certificates.crt
)

昨夜設定した php.iniopenssl.capath を無効にし(コメントアウト)

openssl.cafile=/usr/lib/ssl/cacert.pem

に書き換えて cacert.pem を以下のように取得します

sudo wget -O /usr/lib/ssl/cacert.pem "https://curl.haxx.se/ca/cacert.pem"

これで pecl install が進むようになりました!
この時点での openssl_get_cert_locations() の結果は以下の通り

php -r "print_r(openssl_get_cert_locations());"
Array
(
    [default_cert_file] => /usr/lib/ssl/cert.pem
    [default_cert_file_env] => SSL_CERT_FILE
    [default_cert_dir] => /usr/lib/ssl/certs
    [default_cert_dir_env] => SSL_CERT_DIR
    [default_private_dir] => /usr/lib/ssl/private
    [default_default_cert_area] => /usr/lib/ssl
    [ini_cafile] => /usr/lib/ssl/cacert.pem
    [ini_capath] => 
)

前記事同様に PECL パッケージのインストールをします

Redis

pecl install igbinary
echo 'extension=igbinary.so' > ~/.phpenv/versions/8.0.1/etc/conf.d/pecl-igbinary.ini
sudo apt-get install -y libzstd-dev
pecl install redis
echo 'extension=redis.so' > ~/.phpenv/versions/8.0.1/etc/conf.d/pecl-redis.ini

AMQP

sudo apt-get install -y librabbitmq-dev
git clone https://github.com/php-amqp/php-amqp.git
cd php-amqp
phpize
./configure
make && make test
make install
echo 'extension=amqp.so' > ~/.phpenv/versions/8.0.1/etc/conf.d/pecl-amqp.ini
cd .. && rm -rf php-amqp

PHP インストール完了

phpenv global 8.0.1
php -v
PHP 8.0.1 (cli) (built: Jan 30 2021 15:38:20) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.1, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.1, Copyright (c), by Zend Technologies
    with Xdebug v3.0.2, Copyright (c) 2002-2021, by Derick Rethans

Symfony CLI のインストールと動作確認

Docker, docker-compose もインストールしておきます

余談 `docker-compose` は `virtualenv` & `pip` でインストールする
  • Linux 向けのインストールコマンドを叩いても aarch64 向けのビルドは配布されていない
  • Alternative install options に記載されている virtualenv & pip を使ったインストールを行う

https://docs.docker.com/compose/install/#alternative-install-options

pipenv 内の docker-compose へのエイリアス

echo "alias 'docker-compose'='pipenv run docker-compose'" >> ~/.bash_aliases

2021/01/31 14:44 追記
この方法だと Symfony CLI が docker-compose を認識しないので、記事の下部で回避策を講じています

Node.js, Yarn をインストール

nodenv でよしなにインストールします

Symfony CLI をインストール

https://symfony.com/download

動作確認

symfony book:check-requirements

[OK] Git installed
[OK] PHP installed version 8.0.1 (/home/chatii/.phpenv/versions/8.0.1/bin/php)
[OK] PHP extension "session" installed - required
[OK] PHP extension "openssl" installed - required
[OK] PHP extension "redis" installed - optional - needed only for chapter 11
[OK] PHP extension "gd" installed - optional - needed only for chapter 23 (Imagine)
[OK] PHP extension "json" installed - required
[OK] PHP extension "xml" installed - required
[OK] PHP extension "amqp" installed - required
[OK] PHP extension "zip" installed - optional - needed only for chapter 17 (Panther)
[OK] PHP extension "tokenizer" installed - required
[OK] PHP extension "mbstring" installed - required
[OK] PHP extension "ctype" installed - required
[OK] PHP extension "intl" installed - required
[OK] PHP extension "pdo_pgsql" installed - required
[OK] PHP extension "xsl" installed - required
[OK] PHP extension "sodium" installed - required
[OK] PHP extension "curl" installed - optional - needed only for chapter 17 (Panther)
[OK] Composer installed
[OK] Docker installed
[KO] Cannot find Docker Compose, please install it https://docs.docker.com/compose/install/
[OK] Yarn installed

                                                                        
  You should fix the reported issues before starting reading the book.  
                                                                        

余談 docker-composevirtualenv & pip でインストールする

で導入した docker-compose が認識されていないようなので、さらに回避策を講じてみます

余談 `pipenv` の `docker-compose` を `symfony` に認識させる

.bash_alias に書くことで docker-compose を走らせられるようにしましたが、これでは認識しないので、このエイリアスを削除します

その上で、以下のようなシェルスクリプトを用意しました

bash
#!/bin/bash

pipenv run docker-compose "$@"

そして、これに実行権限を与えて /usr/local/bin に移動します

chmod +x docker-compose
sudo mv docker-compose /usr/local/bin/

動作確認します

docker-compose version
docker-compose version 1.28.2, build unknown
docker-py version: 4.4.1
CPython version: 3.8.6
OpenSSL version: OpenSSL 1.1.1f  31 Mar 2020

以上を踏まえて改めて symfony book:check-requirements で確認

[OK] Git installed
[OK] PHP installed version 8.0.1 (/home/chatii/.phpenv/versions/8.0.1/bin/php)
[OK] PHP extension "xml" installed - required
[OK] PHP extension "mbstring" installed - required
[OK] PHP extension "sodium" installed - required
[OK] PHP extension "redis" installed - optional - needed only for chapter 11
[OK] PHP extension "curl" installed - optional - needed only for chapter 17 (Panther)
[OK] PHP extension "zip" installed - optional - needed only for chapter 17 (Panther)
[OK] PHP extension "json" installed - required
[OK] PHP extension "intl" installed - required
[OK] PHP extension "xsl" installed - required
[OK] PHP extension "openssl" installed - required
[OK] PHP extension "gd" installed - optional - needed only for chapter 23 (Imagine)
[OK] PHP extension "session" installed - required
[OK] PHP extension "tokenizer" installed - required
[OK] PHP extension "pdo_pgsql" installed - required
[OK] PHP extension "amqp" installed - required
[OK] PHP extension "ctype" installed - required
[OK] Composer installed
[OK] Docker installed
[OK] Docker Compose installed
[OK] Yarn installed

                                                                                
 [OK] Congrats! You are ready to start reading the book.                        
                                                                             

Congrats!! お疲れ様でした。今から Symfony に入門します。