Проблема:< /strong>
Проблема возникает, когда я пытаюсь массово создать табели успеваемости или собрать глобальную статистику для всего класса.
В частности:
При формировании отчета карточках для полного класса из 60 учащихся, на странице отображается сообщение "Этот сайт недоступен
"
[img]https:// i.sstatic.net/650ipcCB.png[/img]
примерно через 30 секунд.
Эта проблема также возникает при отправке массовых уведомлений более чем 1000 родителям (например, во время объявления новостей). Также при регистрации массовых данных в базе данных (более 1000 уведомлений при отправке новостей) возникают те же ошибки, но в моей базе все данные сохраняются, но появляется надпись "сайт недоступен".
Наблюдения:
- Когда массовые уведомления обрабатываются в фоновом режиме с помощью Symfony Messenger, процесс работает безупречно, даже для 1000+ уведомлений. .
- Если я сегментирую создание табеля успеваемости (например, 10 учащихся одновременно), процесс завершается быстро и без ошибок.
- В моей локальной среде разработки (Windows 10 с Apache , 8 ГБ ОЗУ), одни и те же задачи выполняются успешно, независимо от размера данных. Даже если процесс занимает от 1 до 10 минут или более, в конечном итоге он дает ожидаемые результаты.
Я изучил потенциальные решения, включая предложения ChatGPT, и реализовал следующие конфигурации:
- отладка с помощью команды **free -h ** я создаю табели успеваемости :

- Обновить ограничение PHP на php.ini из /etc/php/8.2/fpm/php.ini
- -memory_limit=-1
- maximum_time_execution = 3600
- post_max_size = 100 М
- upload_max_filesize = 100 М
- Обновить конфигурацию nginx в /etc/nginx/nginx.conf
Код: Выделить всё
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
# multi_accept on;
}
http {
# Configurations de timeout globales
proxy_read_timeout 300s; # Temps d'attente pour les proxys
fastcgi_read_timeout 300s; # Temps d'attente pour FastCGI
client_max_body_size 100M;
client_body_timeout 300s;
client_header_timeout 300s;
keepalive_timeout 300s;
send_timeout 300s;
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
- вот моя конфигурация MySQL
Код: Выделить всё
#
# The MySQL database server configuration file.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
# Here is entries for some specific programs
# The following values assume you have at least 32M RAM
[mysqld]
#
# * Basic Settings
#
user = mysql
# pid-file = /var/run/mysqld/mysqld.pid
# socket = /var/run/mysqld/mysqld.sock
# port = 3306
# datadir = /var/lib/mysql
# If MySQL is running as a replication slave, this should be
# changed. Ref https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tmpdir
# tmpdir = /tmp
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1
#
# * Fine Tuning
#
#
innodb_buffer_pool_size = 6G
#innodb_log_file_size = 512M
innodb_redo_log_capacity = 1G
innodb_flush_log_at_trx_commit = 2
innodb_io_capacity = 1000
# Memory and performance tuning
key_buffer_size = 64M
max_allowed_packet = 128M
thread_stack = 256K
thread_cache_size = 8
# Table cache
table_open_cache = 2000
# Connections
max_connections = 500
#wait_timeout = 3600
#innodb_lock_wait_timeout = 3600
# Temp tables
tmp_table_size = 64M
max_heap_table_size = 64M
# Temp tables
tmp_table_size = 64M
max_heap_table_size = 64M
# MyISAM recover options
myisam-recover-options = BACKUP
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
#
# Log all queries
# Be aware that this log type is a performance killer.
# general_log_file = /var/log/mysql/query.log
# general_log = 1
# Error log - should be very few entries.
log_error = /var/log/mysql/error.log
# Here you can see queries with especially long duration
# slow_query_log = 1
# slow_query_log_file = /var/log/mysql/mysql-slow.log
# long_query_time = 2
# log-queries-not-using-indexes
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
# server-id = 1
# binlog_expire_logs_seconds = 2592000
max_binlog_size = 100M
# binlog_do_db = include_database_name
# binlog_ignore_db = include_database_name
- Я также попробовал это со своими PHP-FPM Wokers на /etc/php/8.2/fpm/pool.d /www.conf
Код: Выделить всё
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
- sudo cat /var/log/nginx/error.log< /strong>
-sudo grep "500" /var/log/nginx/access.log
Спасибо за любую помощь
Подробнее здесь: https://stackoverflow.com/questions/793 ... e-datasets