Php 当cron作业不是';还不够吗?(菲律宾)

Php 当cron作业不是';还不够吗?(菲律宾),php,cron,beanstalkd,Php,Cron,Beanstalkd,我正试图找出一种最有效的方法,每天数千次运行一个相当繁重的PHP任务。它需要与Gmail建立IMAP连接,循环发送电子邮件,将这些信息保存到数据库,并在本地保存图像 经常使用cron运行这个任务并不是什么大事,但我需要每分钟运行一次,我知道最终cron将开始相互重叠运行,并导致内存问题 当您需要一分钟多次高效地运行任务时,下一步是什么?我一直在读有关beanstalk&pheanstalk的文章,我不完全确定这是否能满足我的需要。想法???我不是PHP高手,但。。。是什么阻止您将脚本作为守护进程

我正试图找出一种最有效的方法,每天数千次运行一个相当繁重的PHP任务。它需要与Gmail建立IMAP连接,循环发送电子邮件,将这些信息保存到数据库,并在本地保存图像

经常使用cron运行这个任务并不是什么大事,但我需要每分钟运行一次,我知道最终cron将开始相互重叠运行,并导致内存问题


当您需要一分钟多次高效地运行任务时,下一步是什么?我一直在读有关beanstalk&pheanstalk的文章,我不完全确定这是否能满足我的需要。想法???

我不是PHP高手,但。。。是什么阻止您将脚本作为守护进程运行?我已经写了很多这样的perl脚本。

或者创建一个锁定机制,这样脚本就不会重叠。这非常简单,因为脚本只在每分钟运行一次,一个简单的.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();
?>

我有很多这样的脚本,我不想从cron运行它们,以防它们堆积起来

#!/bin/sh
php -f fetchFromImap.php
sleep 60
exec $0
exec$0
部分再次启动脚本运行,并在内存中替换自身,因此它将永远运行而不会出现问题。PHP脚本使用的任何内存在退出时都会被清除,因此这也不是问题

一个简单的行将启动它,并将其置于背景中:

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

或者,当机器以各种方式启动时(例如Cron的“重新启动…”),它也可以类似地启动。

如果旧作业仍在运行,fcron将不会启动新作业,您可以使用
@1命令,而不必担心争用条件。

我以前从未编写过守护程序,但现在我将开始做更多的研究。谢谢你的建议。基本上。。。您只需将所有内容包装在
中,同时(1)
并在后台运行脚本。如果重要的是它必须完成某件事,而不仅仅是被杀,那就研究一下信号处理,这样你就可以在离开前清理干净。分叉的好处是,它不需要从后台的shell运行:)我建议使用两个文件:第一个文件创建另一个运行守护进程的进程。第一个进程只需等待几秒钟,然后检查守护进程是否仍在运行。如果没有,它可以重新启动它。我真的不相信PHP能运行这么长时间,所以我认为最好采取预防措施。PHP脚本在长时间运行时没有问题,我们这里的脚本可以运行数周而没有问题。你不必喜欢PHP(我不喜欢),但这种语言已经成熟了很多,现在相当稳定了。@Brian Roach:我相信PHP传统上比Perl有更多的内存泄漏问题。我认为守护进程将是我最好的选择,保持IMAP打开应该会让事情变得更快。谢谢你的建议!这与您的问题没有直接关系,但使用CURL检索图像。它缓存DNS请求,而file_get_contents()&其他本机文件函数不缓存。我曾经需要做一个脚本来检索图像,几乎所有的执行时间都是网络延迟。所以这有助于减少它。