当一个cron工作不够用时我该怎么办? (PHP)

时间:2010-04-21 06:10:34

标签: php cron beanstalkd

我正在努力找出每天运行数千次非常重要的PHP任务的最有效方法。它需要与Gmail建立IMAP连接,循环显示电子邮件,将此信息保存到数据库并在本地保存图像。

使用cron每隔一段时间运行一次这个任务并不是什么大不了的事,但我需要每分钟运行一次,我知道最终crons将开始在彼此之上运行并导致内存问题。

当您需要每分钟多次有效地运行任务时,下一步是什么?我一直在读关于豆茎和豆类的信息。 pheanstalk,我不完全确定这是否能满足我的需求。思考???

4 个答案:

答案 0 :(得分:10)

我不是一个PHP人,但是...是什么阻止你将脚本作为守护进程运行?我写了很多perl脚本,就是这样。

答案 1 :(得分:7)

创建锁定机制,使脚本不会重叠。这非常简单,因为脚本每分钟只运行一次,一个简单的.lock文件就足够了:

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

  do_stuff_here();

  unlink("foo.lock");
?>

这将确保脚本不会并行运行,您只需确保在程序退出时删除.lock文件,因此您应该只有一个退出点(开头的退出除外)

一个很好的选择 - 正如Brian Roach建议的那样 - 是一个专用的服务器进程,它始终运行并保持与IMAP服务器的连接。这大大减少了开销,并没有比编写普通的php脚本困难得多:

<?php
  connect();
  while (is_world_not_invaded_by_aliens())
  {
    get_mails();
    get_images();
    sleep(time_to_next_check());
  }
  disconnect();
?>

答案 2 :(得分:3)

我有很多这样的脚本,我不想在cron中运行它们,以防它们堆叠起来。

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

exec $0部分启动脚本再次运行,在内存中替换自身,因此它将永远运行而不会出现问题。 PHP脚本使用的任何内存在退出时都会被清除,因此这也不是问题。

一个简单的行将启动它,并将其放入后台:

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

或者当机器以各种方式启动时可以类似地启动(例如Cron的'@reboot ....')

答案 3 :(得分:0)

如果旧的工作仍在运行,

fcron http://fcron.free.fr/将无法启动新工作,您可以使用@ 1 command而不用担心竞争条件。