Корневая проблема: библиотека webklex/php-imap загружала все тела писем по умолчанию, что приводило к исчерпанию 256MB памяти при 50+ письмах. Решение (3 уровня): Уровень 1 - Конфигурация: - config/imap.php: добавлены fetch_body=false, fetch_flags=false, fetch_limit=20 - php.ini: увеличен memory_limit с 256M до 1G, добавлены OPcache настройки Уровень 2 - Оптимизация кода: - FetchUnreadEmailsTask: setFetchBody(false), лимиты, MemoryAwareTrait - FetchEmailNewsAction: batch-обработка (10 писем), gc_collect_cycles() - DownloadAttachmentsTask: lazy load вложений, extension whitelist (security) - ConnectToImapTask: MemoryAwareTrait для мониторинга Уровень 3 - Инфраструктура: - ProcessEmailNewsJob: queue job для асинхронной обработки (3 попытки, 300s timeout) - FetchEmailNewsCommand: поддержка --async режима - MemoryAwareTrait: reusable трейт для мониторинга памяти Security fixes: - Extension whitelist для предотвращения path traversal - Убраны реальные email из config/imap.php - Добавлена проверка на null message объект Docs: - README_EMAIL_OPTIMIZATION.md: полная документация по оптимизации Fixes: Allowed memory size of 268435456 bytes exhausted Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
22 lines
809 B
INI
Executable File
22 lines
809 B
INI
Executable File
post_max_size = 128M
|
|
upload_max_filesize = 128M
|
|
|
|
# OPTIMIZATION: Увеличен лимит памяти для обработки больших IMAP-сообщений
|
|
# Предыдущая ошибка: 256MB было недостаточно для загрузки всех писем
|
|
# Теперь: 1GB позволяет обрабатывать письма batch-ами по 10 штук
|
|
memory_limit = 1G
|
|
|
|
request_terminate_timeout = 300
|
|
max_execution_time = 120
|
|
max_input_time = 120
|
|
|
|
# OPTIMIZATION: Настройки OPcache для производительности
|
|
opcache.enable = 1
|
|
opcache.memory_consumption = 128
|
|
opcache.max_accelerated_files = 10000
|
|
opcache.revalidate_freq = 2
|
|
|
|
# OPTIMIZATION: Настройки сессий
|
|
session.gc_maxlifetime = 1440
|
|
session.cookie_lifetime = 0
|