关于php:为什么我的Docker Symfony项目占用大量内存?

Why is my Docker Symfony project consuming so much memory?

描述

我正在生产中部署我的symfony项目。 当我简单地运行docker-compose up时,它工作正常。 但是,我的部署脚本出现问题,请尝试在导航器中访问网页。

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried
to allocate 20480 bytes) in
/var/www/redaph/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php
on line 107

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried
to allocate 65536 bytes) in
/var/www/redaph/vendor/composer/ClassLoader.php on line 444

奇怪的是,在我的dockerfile中,我指定我的PHP_MEMORY_LIMIT为256M。 当我进入容器时,会看到以下内容:

1
2
root@125de315edca:/var/www/redaph# php -i | grep memory_limit
memory_limit => 128M => 128M

为什么我的Docker Symfony项目占用了如此多的内存?

如果正常,则:
如何正确增加我的dockerfile中的PHP_MEMORY_LIMIT?

deploy_prod.sh

1
2
3
4
5
#!/usr/bin/env bash
PROJECT=symfony
docker-compose up -d
docker exec redaph_symfony_1 php bin/console d:s:u --force
docker exec redaph_symfony_1 php bin/console c:c

Dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
FROM php:7.2-apache

ENV \\
    APACHE_ADMIN_EMAIL=webmaster@localhost \\
    PHP_TIME_ZONE=Europe/London \\
    PHP_MEMORY_LIMIT=256M \\
    PHP_UPLOAD_MAX_FILESIZE=32M \\
    PHP_POST_MAX_SIZE=32M

ARG WORK_DIR

WORKDIR $WORK_DIR

COPY composer.lock $WORK_DIR
COPY composer.json $WORK_DIR

ENV COMPOSER_ALLOW_SUPERUSER 1

RUN apt-get update \\
    && apt-get install -y -f apt-transport-https \\
        libicu-dev \\
        libfreetype6-dev \\
        libjpeg62-turbo-dev \\
        libpng-dev \\
        libpq-dev \\
        acl \\
        cron \\
        git \\
        zip \\
    && pecl install mongodb \\
    && docker-php-ext-enable mongodb \\
    && docker-php-ext-install \\
        exif \\
        gd \\
        intl \\
        opcache \\
        pdo_mysql \\
        pdo_pgsql \\
        zip \\
    && curl -sS https://getcomposer.org/installer | php \\
    && mv composer.phar /usr/local/bin/composer \\
    && composer install --no-dev --prefer-dist --optimize-autoloader --no-scripts \\
    && chown -R www-data:www-data $WORK_DIR \\
    && apt-get clean \\
    && rm -rf /var/lib/apt/lists/* \\
    && a2enmod rewrite \\
    && service cron start


问题似乎更可能是应用程序的代码/配置。可能不需要触摸Docker。

根据您配置的处理程序,研究限制独白的缓冲区大小(此处的配置代码-搜索buffer_size)。

使用Composer,在dev中本地运行composer update。部署时,运行composer install。假设安装有一个composer.lock可以使用,updateinstall需要更多的内存来解析依赖关系图。

看起来这是根据您发布的dockerfile进行的操作,但是在此过程中某处可能正在发生/干扰该操作。我会验证composer.lock是否包含您认为的内容,以防万一。

您还可以在运行composer时尝试使用标志memory_limit=-1

php -d memory_limit=-1 composer install rest-of-args-here

如果这还不够,请提供您使用的Symfony版本。发布与独白相关的composer.json和Symfony配置。


这将有助于了解发生错误的那些行上的内容。

关于如何更改您的限额:我的"正确方法",我基本上可以想到2种:

  • 通过单线编辑将RUN放置在dockerfile中,这应该可以使用https://serverfault.com/questions/96372/sed-php-ini-memory-limit。

  • 在本地保留一个php.ini文件,该文件将被复制到容器中。要使Docker复制它,请在docker-compose文件中的音量键下一行

    • / ini /位置/在/本地:/ ini /位置/容器

    对于您的情况,我觉得这很麻烦,只有在文件需要大量/连续编辑的情况下,我才会这样做,事实并非如此。

还有另一种选择,但是每次构建时都需要您这样做,但这并不是真的有用:

  • 泊坞窗exec-无论bash

假设您拥有正确的工具(sed,vim和所需的任何工具),则可以从那里开始编辑文件。