我想每分钟由cron运行FuelPHP Task。 但我不想运行重复的FuelPHP任务。
你知道吗?我试图通过pid控制,但getmypid()总是返回相同的值...
答案 0 :(得分:1)
另一个解决方案是(如果您不需要将数据发送到您的流程,但它自己读取数据(例如,来自数据库))您可以使用具有长期运行任务的流程管理器(基本上是无限循环)。 (实际上,您还需要基于队列的解决方案中的流程管理器,因为它需要接收方的工作人员)
我通常会将Supervisord用于此目的。
一个简单,长期运行的应用程序:
while (true) {
// do something
sleep(1);
}
supervisord的优点是,如果由于某种原因停止,它可以重新启动你的进程。
答案 1 :(得分:0)
对于此类任务,您最好的选择可能是使用某种排队系统。我找到了最好看的Bernard。你应该看看。
(编辑:我根据您的需要对您的任务做了一个假设,让他们不要重叠,这就是我推荐队列的原因。如果这对您来说是新的,请看看它们,并确定哪个更适合您,如果它不适合您,搜索单个任务关键字的人仍然可以找到有用的队列,所以我将其留在答案中。)
如果您的环境由于某种原因不允许这样的解决方案,或者您真的只需要一个方法来判断前一个进程是否正在运行,那么您应该只在temp目录中创建一个lockfile,类似{ {1}}任务启动时,并在终止(删除或崩溃)时删除它。然后,您可以检查文件是否存在。
这是此问题的常见解决方案,但使用队列系统更灵活,更优雅。
其他可能性是使用非空的pidfiles,但存储第一个正在运行的任务的进程ID,因此您甚至可以终止它,或向其发送消息。与lockfiles相同,您将它放在临时目录中,并将其命名为mytask.lock
(或任何您想要的,但mytask.pid
很常见)。