Ошибка развертывания приложения Symfony 3.4.10: допустимый объем памяти исчерпан StreamHandler.php

Контекст

Я пытаюсь развернуть новое приложение Symfony 3.4.10. Я впервые развертываю приложение Symfony. Он хорошо работает в среде разработки с использованием встроенного php-сервера.

Я использую nginx как веб-сервер и php-fpm.

Проблема

Когда я пытаюсь связаться со своим приложением, в моих журналах появляется сообщение об ошибке:

2018/05/25 02:32:03 [error] 15819#15819: *1 FastCGI sent in stderr: 
    "PHP message: PHP Fatal error:  Allowed memory size of 1073741824 bytes exhausted 
    (tried to allocate 20480 bytes) 
    in /var/www/my-project/application/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php 
    on line 107
PHP message: PHP Fatal error: 
    Allowed memory size of 1073741824 bytes exhausted 
    (tried to allocate 20480 bytes) 
    in /var/www/my-project/application/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php 
    on line 107"
    while reading response header from upstream, 
    client: xx.xx.xx.xx, server: preprod.my-website.fr, 
    request: "GET / HTTP/2.0", 
    upstream: "fastcgi://unix:/var/run/php/php7.0-fpm.sock:", 
    host: "preprod.mywebsite.fr"

Страница, которую я пытаюсь загрузить, - это просто форма для подключения.

Я выделил 1024 МБ в моем php.ini, думая, что это связано с тем, что приложению требуется больше оперативной памяти при первом вызове.

Что кажется действительно странным, так это то, что журнал сообщает, что размер памяти исчерпан, но сумма, которую приложение пытается выделить, действительно мала: 20480 bytes выделен для максимального количества 1073741824 bytes, я не понимаю, почему это не удается и как решить эту проблему .

Конфигурация моего сайта nginx:

server {
    listen 443;
    listen [::]:443;

    server_name preprod.my-website.fr;
    root /var/www/my-project/application/web;

    location / {
        # try to serve file directly, fallback to app.php
        try_files $uri /app.php$is_args$args;
    }

    # PROD
    location ~ ^/app\.php(/|$) {
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        # When you are using symlinks to link the document root to the
        # current version of your application, you should pass the real
        # application path instead of the path to the symlink to PHP
        # FPM.
        # Otherwise, PHP's OPcache may not properly detect changes to
        # your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126
        # for more information).
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        # Prevents URIs that include the front controller. This will 404:
        # http://domain.tld/app.php/some-path
        # Remove the internal directive to allow URIs like this
        internal;
    }

    # return 404 for all other php files not matching the front controller
    # this prevents access to other php files you don't want to be accessible.
    location ~ \.php$ {
        return 404;
    }

    error_log /var/log/nginx/my-project_error.log;
    access_log /var/log/nginx/my-project_access.log;

    # SSL configuration
    ssl on;
    ssl_certificate /etc/letsencrypt/live/preprod.my-website.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/preprod.my-website.fr/privkey.pem;
}

server {
    listen 0.0.0.0:80;
    server_name preprod.my-website.fr;
    rewrite ^ https://$host$request_uri? permanent;
}

Возможно ли, что вы модифицировали не тот php.ini? Часто существуют разные конфигурации для разных саписов (cli, apache module, php-fpm). Также перезагрузите php-fpm после обновления!

Cameron Hurd 25.05.2018 02:57

В первый раз я отредактировал неправильный (так что Allowed memory size of xxx bytes не менялся, потом мне удалось найти хороший, отредактировать его, и сообщение изменилось на Allowed memory size of 1073741824 bytes (1024 МБ). Но спасибо за вопрос, часто бывает проблема действительно!

darckcrystale 25.05.2018 03:10

Хороший! Хорошее расследование. :)

Cameron Hurd 25.05.2018 15:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
1 662
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это имеет смысл:

(1073741824b + 20480b)/1024/1024 = 1024mb

Эти дополнительные 20480b устанавливают предел.

Вы всегда можете изменить настройку в php.ini, но настоящий вопрос в том, почему он потребляет столько памяти? Часто ли Symfony потребляет столько? Также, если есть какая-то утечка или неограниченный процесс потребления памяти, он, скорее всего, в какой-то момент выйдет из строя из-за увеличенного объема памяти.

Я думаю, что действительно есть утечка памяти, но выданная ошибка говорит, что она исходит от /var/www/my-project/application/vendor/monolog/monolog/src/M‌​onolog/Handler/Strea‌​mHandler.php, это не один из моих файлов, а файл Symfony, я никогда его не редактировал.

darckcrystale 25.05.2018 08:28

Значит, прямо перед вызовом этого файла будет что-то, что займет почти 1024 МБ, и это будет вызов этого файла, который превысит предел памяти?

darckcrystale 25.05.2018 08:29
Ответ принят как подходящий

Итак, я понял, как заставить мое приложение работать! Это была проблема с правами на мои файлы, пользователь php-fpm не мог получить доступ к файлам, и это привело к тому, что Symfony попыталась отправить ошибку.

Я не знаю, почему исключение, созданное Symfony LogicException: Missing stream url, the stream can not be opened. This may be caused by a premature call to close()., перегрузило лимит памяти, поэтому, если кто-то знает, почему, было бы очень полезно объяснить это!

Другие вопросы по теме