Скачать вложения электронной почты через Simulataneous Cron Jobs - условия гонки - PullRequest
2 голосов
/ 09 июля 2010

Мне нужна работа cron для проверки учетных записей электронной почты и загрузки определенных вложений. Эта работа cron будет выполняться каждую минуту. Моя проблема в том, что когда первый скрипт загружает вложения электронной почты, второй (или третий, или четвертый ...) сценарий, скорее всего, будет запускаться вместе с ранее выполненным сценарием. Проблема заключается в том, что я не уверен, что является лучшим способом предотвратить попытки последующих сценариев загрузить вложения электронной почты, которые были загружены (или загружаются в настоящее время) предыдущими сценариями.

Другие детали:

  • Использование CodeIgniter
  • Использование библиотеки Zend Mail для доступа к электронной почте и загрузки вложений
  • Электронная почта, вероятно, будет POP3

Мне интересно, могу ли я как-нибудь использовать заголовок "message-id".

1 Ответ

2 голосов
/ 09 июля 2010

Вы можете просто запретить запуск одновременных скриптов cron с помощью файла блокировки. Вы, вероятно, не хотите, чтобы одновременные скрипты загружали вложения, у вас будут неприятные условия гонки.

Работает так:

starter.sh

  • Проверяет, существует ли файл блокировки, и немедленно закрывается.
  • Если этого не происходит, он создает файл блокировки и запускает скрипт main.php.
  • После завершения main.php он удаляет файл блокировки.
  • Таким образом, если main.php вылетает или выдает исключение, файл блокировки удаляется и может быть перезапущен в следующую минуту.

main.php

  • выполняет фактическую загрузку.

Редактировать

Понятно. Затем вам нужна более сложная настройка. однопоточный скрипт, который считывает from, subject и datetime и помещает их в очередь (для этого идеально подходит таблица db). Это должно работать, как я объяснил выше. Во-вторых, у вас есть пул php-процессов, которые читают таблицу db и загружают вложения на основе данных в таблице.

Поскольку они работают с поточно-ориентированной структурой данных (базой данных), они могут установить флаг в каждой строке, который говорит о загрузке / загрузке.

Они просто работают в цикле с выбором SQL в верхней части (выберите топ 1 не загруженные / загружаемые сообщения). Вам понадобится что-то для обработки сбоев и перезапуска процессов php, но в этом суть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...