我正在努力找出每天运行数千次非常重要的PHP任务的最有效方法。它需要与Gmail建立IMAP连接,循环显示电子邮件,将此信息保存到数据库并在本地保存图像。
使用cron每隔一段时间运行一次这个任务并不是什么大不了的事,但我需要每分钟运行一次,我知道最终crons将开始在彼此之上运行并导致内存问题。
当您需要每分钟多次有效地运行任务时,下一步是什么?我一直在读关于豆茎和豆类的信息。 pheanstalk,我不完全确定这是否能满足我的需求。思考???
答案 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
而不用担心竞争条件。