Как запустить php скрипт что бы он не отлетел по тайм ауту?
День добрый.
Есть скрипт который должен распарсить почтовый ящик клиента с mail.ru и перелить его в бд.
Отдельные части скрипта протестированы и реализованы сделаны тесты на небольшом количестве писем.
Сейчас нужно запустить его на выкачку ящика полностью. Но в ящике 20 тысяч писем и время выполнения скрипта получается порядка 48 часов.
Скрипт запускается из консоли сервера.
В самом файле стоит set_time_limit(0);
Однако где то минут через 20-30 скрипт вылетает с сообщением "Killed".
т.е. как бы понятно что скрипт убивает сам сервер, но не понятно почему. Где можно искать причину такого поведения?
P.S
На тестах ставили ограничение в 2 часа и 500 писем. скрипт отрабатывал до конца
Нет возможности промаркировать письма что бы отследить что уже выкачано, а что нет чтобы например качать по кусочкам.
Также ящик весьма активный и id писем между запусками могут поменяться, т.е. использовать их для идентификации сообщений не получилось.
По логике скрипта, сперва выкачиваются все письма потом они заливаются в бд. - не указал в изначальной задаче.
но как это решить и в процессе чистить память я знаю. Главное - что бы скрипт мог отработать 2 дня без прерываний
По логике скрипта, сперва выкачиваются все письма потом они заливаются в бд. - не указал в изначальной задаче.
но как это решить и в процессе чистить память я знаю. Главное - что бы скрипт мог отработать 2 дня без прерываний
Доброе утро.
Используйте cron, запускайте скрипт при помощи этого инструмента, там нет ограничений по времени выполнения.
У каждого письме есть свой id в почтовом ящике, ориентируйтесь по нему.
Записывайте этот параметр в базу, проверяйте, какие письма записаны, а какие нет.
Используйте cron, запускайте скрипт при помощи этого инструмента, там нет ограничений по времени выполнения
Не знал, спасибо.
У каждого письме есть свой id в почтовом ящике
не могу ответить почему, но при каждом запросе по одному и тому же id отдаются разные письма. Возможно особенность библиотеки которую использую или сервера mail.
Есть ли возможность по API сортировать письма по дате и задавать offset, limit при выгрузке писем?
Увы нет, работают только самые простые флаги. ALL UNSEEN и т.д. Хороший вариант был бы пометить все письма как непрочитанные и по мере выкачивания менять им флаги. Но клиент против.
не могу ответить почему, но при каждом запросе по одному и тому же id ...
Андрей Корехов, точно не могу сказать. Делал подобный парсер, но почту забирал из gmail. Там было что-то подобное id, в общем можно было понять, парсилось это письмо или нет.
В общем попробуйте в документации посмотреть. Документация именно mail.ru, как работать с почтой, может там найдёте ответ.
При использовании corn Вы не будете видеть процесс выполнения. Но можно заморочиться и через события получать информацию о ходе выполнения скрипта.
Как бы не менялся ID письма в системе Mail.ru, всё равно в каждом письме есть ID на уровне SMTP-транспорта. Он генерируется при обработке входящего письма, вписывается в заголок письма, и в дальнейшем уже не меняется. Его видно при просмотре заголовков письма (в WEB-морде: в заголовке - три точки - Ещё - Служебные заголовки). Можно ориентироваться на этот id 2pnGeid-020FNtx-6A, уж он то не поменяется точно:
Received: from mx9.mlrmr.com ([188.93.63.132]:55018)
by mx218.i.mail.ru with esmtp (envelope-from <e@ma.il>)
id 2pnGeid-020FNtx-6A
for username@mail.ru; Wed, 14 Dec 2022 03:49:25 +0300
Спасибо за помощь.
В целом в скрипте mysqli после каждого запроса потихоньку кушал память до переполнения из за этого скрипт и выпадал с killed
сейчас этот момент оптимизировал 4 час скрипт работает нормально.
Причину почему запрос падал увидел благодаря команде dmesg -T
И отдельное спасибо что рассказали что у письма есть еще отдельный id по которому можно его идентифицировать независимо от id под которым возвращает письма imap. (подробнее есть в комментариях)