【phpmyadmin】「アップロードしようとしたファイルが大きすぎるようです」エラーが出た場合の原因と解決方法

# 概要
* Dockerコンテナで起動しているphpmyadminにSQLのZIPファイルをインポートしたら、以下のエラーが出てきました。

```
アップロードしようとしたファイルが大きすぎるようです。この制限に関する対策については ドキュメント をご覧ください。
```

* このエラーは、アップロードしようとしたファイルが許容されたサイズを超えていることを意味しています。
* 本記事では、このエラーの原因と解決方法を記載します。

## 環境
* Docker
    * Client: Docker Engine - Community: 20.10.23
    * Server: Docker Desktop 4.13.1 (90346): 20.10.20
* docker compose: 3.3
* python:3.6
* phpmyadmin： 5.2.0
* (phpmyadmin)PHP: PHP 8.0.19 (cli)
* (phpmyadmin)MySQL Community Server (GPL): 5.7.30
* (phpmyadmin)Apache/2.4.53 (Debian)


## 原因の追求
* phpmyadminはデフォルトでは`2,048K`がMAXになっています。今回アップロードしたファイルは`5.9MB`あったので、確かにオーバーしています。ということでググってみると、`php.ini`ファイルを編集してあげれば良いという記事が多かったので実際やって見ました。
    * 公式サイト：[Environment variables summary](https://github.com/phpmyadmin/docker#environment-variables-summary)
* phpmyadminのdockerコンテナに入って、以下コマンドで読み込んでいる`php.ini`を見てみます。すると以下のように設定されていました。あれ、`(none)`になってる！？

```terminal
$ php --ini

Configuration File (php.ini) Path: /usr/local/etc/php
Loaded Configuration File:         (none)
Scan for additional .ini files in: /usr/local/etc/php/conf.d
Additional .ini files parsed:      /usr/local/etc/php/conf.d/000-xxx.ini,
/usr/local/etc/php/conf.d/docker-php-ext-bz2.ini,
/usr/local/etc/php/conf.d/docker-php-ext-gd.ini,
/usr/local/etc/php/conf.d/docker-php-ext-mysqli.ini,
/usr/local/etc/php/conf.d/docker-php-ext-opcache.ini,
/usr/local/etc/php/conf.d/docker-php-ext-sodium.ini,
/usr/local/etc/php/conf.d/docker-php-ext-zip.ini,
/usr/local/etc/php/conf.d/opcache-recommended.ini,
/usr/local/etc/php/conf.d/phpmyadmin-misc.ini,
/usr/local/etc/php/conf.d/session-strict.ini
```

* ということで、`php.ini`を`/usr/local/etc/php`に新規作成し、以下の項目を変えて見ました。

```ini
upload_max_filesize = 200M
post_max_size = 200M
```

* これで再起動！してみるものの、phpmyadminでの表示は`2,048K`が最大サイズのまま変わりません。
* nginxを使っているので、ウェブサーバーを再起動してみましたが、変わらず。
* うーん、なんでだろう。ということで、違う方法はないか調べて見たところ、ありました。

# 解決方法
* 以下の記事に、`docker-compose.yml`を直接編集してあげる方法もあると記載あり。
    * [Docker: PhpMyAdmin has an upload limit of 2048KiB](https://stackoverflow.com/questions/58868237/docker-phpmyadmin-has-an-upload-limit-of-2048kib)
* この通りに、以下のように追記しました。


```yaml
        environment:
          PMA_HOST: "mysql"
          PMA_PORT: 3306
          UPLOAD_LIMIT: 300M
```

* これで再起動すると、、、phpmyadminの「アップロードファイル」の表示が変わりました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/644a4a4f-4b0a-dc72-af96-a4212fb4ef3d.png)

* 念の為、なんで`php.ini`編集しても治らなかったのかなと思い、`phpmyadmin-misc.ini`を見てみる。
* 以下のように`docker-compose.yml`ファイルで設定した環境変数はここで指定されています。

```ini
allow_url_fopen=Off
max_execution_time=${MAX_EXECUTION_TIME}
max_input_vars=10000
memory_limit=${MEMORY_LIMIT}
post_max_size=${UPLOAD_LIMIT}
upload_max_filesize=${UPLOAD_LIMIT}
```

* もしかして、`phpmyadmin-misc.ini`が`php.ini`より優先されているのでは？と思います。
* 一般的には、`php.ini`ファイルで明示的に設定された値が`phpmyadmin-misc.ini`よりも優先されるらしいですが、Dockerコンテナ内でPHPが実行されるときは、環境変数でオーバーライドされた場合が優先されるのかもしれません。上記の参考記事で挙げたstackflowでも同じようなコメントがあるので、その可能性が高いような。確実な情報をお持ちの方がいたらぜひ教えてください。おそらく以下の要素によって`php.ini`ファイルと`phpmyadmin-misc.ini`どちらが優先されるか異なると思われます。
    * Docker、docker-composeのバージョン
    * PHP、phpMyAdminのバージョン
    * OS
* ちなみに、直接`docker-compose.yml`に書き込まなくとも、任意に設定した別ファイルをローカルに作成してマウントする、という方法もあります。


```yml
phpmyadmin:
 volumes: 
 - ./phpmyadmin-misc.ini:/usr/local/etc/php/conf.d/phpmyadmin-misc.ini
```


* ということで、`php.ini`を編集しても変わらなかった、という方は、`docker-compose.yml`から試して見てください。