Я пытаюсь выяснить самый эффективный путь к выполнению довольно значительной задачи PHP тысячи времен в день. Это должно установить связь IMAP с Gmail, циклом по электронным письмам, сохранить эту информацию к базе данных и сохранить образы локально.
При выполнении этой задачи каждый, которым так часто использование крона не состоит в том, что большой из соглашения, но я должен выполнять ее каждую минуту и я знаю в конечном счете, что кроны начнут работать друг на друга и вызовут проблемы памяти.
Каково следующее, повышаются, когда необходимо эффективно выполнить задачу многократно в минуту? Я читал о бобовом стебле и pheanstalk, и я не совсем уверен, сделает ли это то, в чем я нуждаюсь. Мысли???
Либо создайте механизм блокировки, чтобы сценарии не перекрывались. Это довольно просто, поскольку сценарии запускаются только каждую минуту, достаточно простого файла .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();
?>
Я не специалист по PHP, но ... что мешает вам запустить ваш скрипт в качестве демона? Я написал много Perl-скриптов, которые именно это и делают.
У меня есть несколько подобных скриптов, и я не хочу запускать их из 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}} fcron http://fcron.free.fr/ не запустит новое задание, если старое все еще выполняется. Вы можете использовать команду @ 1
и не беспокойтесь об условиях гонки.