Я пытаюсь развернуть новое приложение 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, я не понимаю, почему это не удается и как решить эту проблему .
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;
}
В первый раз я отредактировал неправильный (так что Allowed memory size of xxx bytes не менялся, потом мне удалось найти хороший, отредактировать его, и сообщение изменилось на Allowed memory size of 1073741824 bytes (1024 МБ). Но спасибо за вопрос, часто бывает проблема действительно!
Хороший! Хорошее расследование. :)






Это имеет смысл:
(1073741824b + 20480b)/1024/1024 = 1024mb
Эти дополнительные 20480b устанавливают предел.
Вы всегда можете изменить настройку в php.ini, но настоящий вопрос в том, почему он потребляет столько памяти? Часто ли Symfony потребляет столько? Также, если есть какая-то утечка или неограниченный процесс потребления памяти, он, скорее всего, в какой-то момент выйдет из строя из-за увеличенного объема памяти.
Я думаю, что действительно есть утечка памяти, но выданная ошибка говорит, что она исходит от /var/www/my-project/application/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php, это не один из моих файлов, а файл Symfony, я никогда его не редактировал.
Значит, прямо перед вызовом этого файла будет что-то, что займет почти 1024 МБ, и это будет вызов этого файла, который превысит предел памяти?
Итак, я понял, как заставить мое приложение работать! Это была проблема с правами на мои файлы, пользователь php-fpm не мог получить доступ к файлам, и это привело к тому, что Symfony попыталась отправить ошибку.
Я не знаю, почему исключение, созданное Symfony LogicException: Missing stream url, the stream can not be opened. This may be caused by a premature call to close()., перегрузило лимит памяти, поэтому, если кто-то знает, почему, было бы очень полезно объяснить это!
Возможно ли, что вы модифицировали не тот
php.ini? Часто существуют разные конфигурации для разных саписов (cli, apache module, php-fpm). Также перезагрузите php-fpm после обновления!