fix(IMAP): оптимизация обработки email для предотвращения memory exhaustion
Корневая проблема: библиотека 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>
This commit is contained in:
+18
-1
@@ -1,4 +1,21 @@
|
||||
post_max_size = 128M
|
||||
upload_max_filesize = 128M
|
||||
memory_limit = 256M
|
||||
|
||||
# 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
|
||||
|
||||
Reference in New Issue
Block a user