Что я использую, когда задание крона не достаточно? (php)

Я пытаюсь выяснить самый эффективный путь к выполнению довольно значительной задачи PHP тысячи времен в день. Это должно установить связь IMAP с Gmail, циклом по электронным письмам, сохранить эту информацию к базе данных и сохранить образы локально.

При выполнении этой задачи каждый, которым так часто использование крона не состоит в том, что большой из соглашения, но я должен выполнять ее каждую минуту и я знаю в конечном счете, что кроны начнут работать друг на друга и вызовут проблемы памяти.

Каково следующее, повышаются, когда необходимо эффективно выполнить задачу многократно в минуту? Я читал о бобовом стебле и pheanstalk, и я не совсем уверен, сделает ли это то, в чем я нуждаюсь. Мысли???

10
задан mike 21 April 2010 в 06:10
поделиться

4 ответа

Либо создайте механизм блокировки, чтобы сценарии не перекрывались. Это довольно просто, поскольку сценарии запускаются только каждую минуту, достаточно простого файла .lock:

<?php
  if (file_exists("foo.lock")) exit(0);
  file_put_contents("foo.lock", getmypid());

  do_stuff_here();

  unlink("foo.lock");
?>

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

Хорошая альтернатива - как предложил Брайан Роуч - это выделенный серверный процесс, который работает все время и поддерживает соединение с IMAP-сервером.Это значительно снижает накладные расходы и не намного сложнее, чем написать обычный скрипт php:

<?php
  connect();
  while (is_world_not_invaded_by_aliens())
  {
    get_mails();
    get_images();
    sleep(time_to_next_check());
  }
  disconnect();
?>
7
ответ дан 3 December 2019 в 19:32
поделиться

Я не специалист по PHP, но ... что мешает вам запустить ваш скрипт в качестве демона? Я написал много Perl-скриптов, которые именно это и делают.

10
ответ дан 3 December 2019 в 19:32
поделиться

У меня есть несколько подобных скриптов, и я не хочу запускать их из cron, если они складываются.

#!/bin/sh
php -f fetchFromImap.php
sleep 60
exec $0

Часть exec $ 0 снова запускает скрипт, заменяя себя в памяти, поэтому он будет работать вечно без проблем. Любая память, которую использует скрипт PHP, очищается при выходе, так что это тоже не проблема.

Простая строка запустит его и поместит на задний план:

cd /x/y/z ; nohup ./loopToFetchMail.sh &

или он может быть аналогичным образом запущен, когда машина запускается с помощью различных средств (например, Cron's '@reboot ....')

{ {1}}
3
ответ дан 3 December 2019 в 19:32
поделиться

fcron http://fcron.free.fr/ не запустит новое задание, если старое все еще выполняется. Вы можете использовать команду @ 1 и не беспокойтесь об условиях гонки.

0
ответ дан 3 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: