Ubuntu 20.04 で Composer を使ったパッケージのインストールではまったお話

いつものように Composer を使ってパッケージをインストールしたはずなのに、なぜかサーバエラー。ログを確認すると

PHP Warning:  require(/var/www/test/vendor/composer/../symfony/polyfill-mbstring/bootstrap.php): Failed to open stream: Permission denied in /var/www/test/vendor/composer/autoload_real.php on line 78
PHP Fatal error: Uncaught Error: Failed opening required '/var/www/test/vendor/composer/../symfony/polyfill-mbstring/bootstrap.php' (include_path='.:/usr/share/php') in /var/www/test/vendor/composer/autoload_real.php:78

というように、パーミッション周りのエラーが出ていました。では、ということでパーミッションを確認すると

-rw-rw-r-- 1 test test 7237 Nov  3 14:55 /var/www/test/vendor/composer/../symfony/polyfill-mbstring/bootstrap.php

というように、一見パーミッションには問題がないように見えます。ここでさんざん悩んだのですが、この問題、Composer と Ubuntu 20.04 の p7zip-full パッケージに含まれている 7z コマンドの問題のようで、Composer パッケージの解凍に 7z を使うと、パーミッションが正しく設定されないようです(Composer の関連 Issue)。

確かに、このファイルが含まれているディレクトリのパーミッションを確認すると

drwx------  3 test test  4096 Nov  3 14:55 ./
drwxrwxr-x 30 test test  4096 Jan 12 00:27 ../
-rw-rw-r--  1 test test  8784 Nov  3 14:55 bootstrap80.php
-rw-rw-r--  1 test test  7237 Nov  3 14:55 bootstrap.php
-rw-rw-r--  1 test test  1056 Nov  3 14:55 composer.json
-rw-rw-r--  1 test test  1065 Nov  3 14:55 LICENSE
-rw-rw-r--  1 test test 29149 Nov  3 14:55 Mbstring.php
-rw-rw-r--  1 test test   370 Nov  3 14:55 README.md
drwx------  3 test test  4096 Nov  3 14:55 Resources/

というように、ディレクトリについてインストールしたユーザー以外に何の権限も与えられていません(700)。

パッケージインストール時のログをよく見ると

Unzipping using 7z 16.02 may result in incorrect file permissions. Install 7z 21.01+ or unzip to ensure you get correct permissions.

と書いてあるのですが、インストール自体はエラーも出ずに終了しますし、PHP のエラーログだけではなかなか気づきませんよね。。

対応方法としては、unzip パッケージをインストールすることです。unzip パッケージインストール後に composer install すると

drwxrwxr-x  3 test test  4096 Nov  3 14:55 ./
drwxrwxr-x 30 test test  4096 Jan 12 01:04 ../
-rw-rw-r--  1 test test  8784 Nov  3 14:55 bootstrap80.php
-rw-rw-r--  1 test test  7237 Nov  3 14:55 bootstrap.php
-rw-rw-r--  1 test test  1056 Nov  3 14:55 composer.json
-rw-rw-r--  1 test test  1065 Nov  3 14:55 LICENSE
-rw-rw-r--  1 test test 29149 Nov  3 14:55 Mbstring.php
-rw-rw-r--  1 test test   370 Nov  3 14:55 README.md
drwxrwxr-x  3 test test  4096 Nov  3 14:55 Resources/

というように、正しくパーミッションが設定されていることがわかります。