2010-07-08 2 views
2

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

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

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

мне интересно, если я может как-то использовать заголовок «message-id».

ответ

2

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

работает так:

starter.sh

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

main.php

  • делает фактическую загрузку.

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

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

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

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

+0

Несколько сценариев, работающих одновременно, на самом деле идеальны. Я пытаюсь имитировать многопоточность. Я имею дело с тысячами вложений электронной почты в час. – StackOverflowNewbie

Смежные вопросы