
1つの処理でメモリの利用料がデフォルト設定で制限されている最大値を超えると
Allowed memory size of 268435456 bytes exhausted (tried to allocate 4096 bytes)
こんなエラーが出てしまう。
メモリに余裕があるなら、php.ini
のmemory_limit
を書き換えてリビルドすればいい。
php.iniの保存場所を特定
Dockerfileを見てみよう。
自分の場合は下記のパスだった。
infra/php/Dockerfile
FROM php:8.0-fpm-buster
SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]
ENV COMPOSER_ALLOW_SUPERUSER=1 \
COMPOSER_HOME=/composer
COPY --from=composer:2.0 /usr/bin/composer /usr/bin/composer
RUN apt-get update && \
apt-get -y install git unzip libzip-dev libicu-dev libonig-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev && \
apt-get clean && \
apt-get install nkf && \
rm -rf /var/lib/apt/lists/* && \
docker-php-ext-configure gd --with-freetype --with-jpeg && \
docker-php-ext-install -j$(nproc) gd && \
docker-php-ext-install intl pdo_mysql zip bcmath
COPY ./php.ini /usr/local/etc/php/php.ini
WORKDIR /work
したから2行目に
COPY ./php.ini /usr/local/etc/php/php.ini
とあることから相対パスで./php.ini
つまり、本例の環境だとinfra/php/php.ini
にあることがわかった。
php.iniの編集
zend.exception_ignore_args = off
expose_php = on
max_execution_time = 30
max_input_vars = 1000
upload_max_filesize = 64000M
post_max_size = 128000M
memory_limit = 1024M
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
log_errors = on
error_log = /dev/stderr
default_charset = UTF-8
[Date]
date.timezone = Asia/Tokyo
[mysqlnd]
mysqlnd.collect_memory_statistics = on
[Assertion]
zend.assertions = 1
[mbstring]
mbstring.language = Japanese
7行目をmemory_limit = 1024M
にした。
元々は256M
になっていたが、これで1発の処理で最大1GBぐらいメモリが使えるようになる。
もちろんたくさんの人がこの処理を同時に走らせると、一時的にサービスが止まる可能性はある。
今回自分の環境は、数人で使う簡素な社内システムだったので上記のように変更。
Dockerリビルド
php.ini
ファイルのmemory_limit
の値が正しく1024M
に設定されていることを再確認します。docker-compose down
コマンドを使って、すべてのコンテナを停止し、ネットワークやボリュームを削除します。docker-compose build --no-cache app
コマンドを実行して、キャッシュを無視してapp
サービスのイメージを再構築します。※コンテナ名app
の部分は自分の環境に合わせてくれ。docker-compose up -d
コマンドを使って、コンテナを再起動します。- 再度
docker-compose exec app php -r "echo ini_get('memory_limit');"
を実行し、memory_limit
の値が更新されていることを確認します。
「5」のコマンドはコンテナの外で叩いてね。
1024M%
と返ってくれば成功。
コンテナ中で直接echo ini_get('memory_limit');
を叩いても何も表示されなかった。