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

mik*_*ike 10 php cron beanstalkd

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

使用cron经常运行这个任务并不是什么大不了的事,但我需要每分钟都运行它,我知道最终crons将开始在彼此之上运行并导致内存问题.

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

Bri*_*ach 10

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


Mor*_*dur 7

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

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

  do_stuff_here();

  unlink("foo.lock");
?>
Run Code Online (Sandbox Code Playgroud)

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

正如Brian Roach建议的那样,一个很好的替代方案是一个专用的服务器进程,它始终运行并保持与IMAP服务器的连接.这样可以减少很多开销,并且比编写普通的php脚本要难得多:

<?php
  connect();
  while (is_world_not_invaded_by_aliens())
  {
    get_mails();
    get_images();
    sleep(time_to_next_check());
  }
  disconnect();
?>
Run Code Online (Sandbox Code Playgroud)

  • 我认为守护进程是我最好的选择,保持IMAP开放应该会让事情变得更快.感谢您的建议! (2认同)