Php 每隔15秒进行一次cron

Php 每隔15秒进行一次cron,php,hosting,cron,dedicated,betfair,Php,Hosting,Cron,Dedicated,Betfair,即使在专用服务器上,我也无法将cron时间设置为小于1分钟。 我需要它每15秒运行一次,因为它调用betfair api,并且计算高度依赖于时间。 请告知。Cron只允许您以每分钟一次的速度运行 我要做的是在你的脚本中做15秒的计时 每分钟执行一次父脚本 在脚本存在并开始新周期之前,在该脚本中每隔15秒执行一次子脚本 如果您需要每隔15秒调用一次作业,请不要使用cron。cron的设计目的是请求要在很久以后完成的作业 相反,在父脚本完成作业后,先休眠15秒,然后调用子脚本,然后退出。子脚本可以

即使在专用服务器上,我也无法将cron时间设置为小于1分钟。 我需要它每15秒运行一次,因为它调用betfair api,并且计算高度依赖于时间。
请告知。

Cron只允许您以每分钟一次的速度运行

我要做的是在你的脚本中做15秒的计时

  • 每分钟执行一次父脚本
  • 在脚本存在并开始新周期之前,在该脚本中每隔15秒执行一次子脚本

如果您需要每隔15秒调用一次作业,请不要使用cron。cron的设计目的是请求要在很久以后完成的作业

相反,在父脚本完成作业后,先休眠15秒,然后调用子脚本,然后退出。子脚本可以完成它的工作,睡眠15秒,然后调用下一个脚本。起泡,冲洗,重复


如果您的服务器没有时间限制,那么您甚至不需要生成子脚本。只要睡15秒,做你的事,睡15秒,做下一件事,依此类推。睡眠脚本不消耗CPU,尽管它确实消耗RAM。但这比循环你主人的PID要好;这可能会使主机感到不安。

Cron是一种作业调度程序,其构建的分辨率至少为一分钟。如果你需要一个比这更好的分辨率,你要么找到另一个调度工具,要么自己动手

我过去用过的一个例子如下。您配置了所需的间隙和最小间隙,以下脚本将每隔
N
秒执行一次有效负载。请注意,这不是一个简单的“每次迭代之间等待
N
秒”调度程序。实际上,它在上一次迭代开始后几秒钟开始下一次迭代,而不是在结束后

最小间隙存在,因此,如果有效负载占用的时间超过
N
秒,则它不会连续运行。如果您确实希望它在这种情况下连续运行,只需将最小间隙设置为0

执行此操作的代码如下所示:

#!/usr/bin/bash

payload() {
        if [[ $1 -eq 1 ]] ; then
                echo "Sleeping for  1 second  at $(date +%H:%M:%S)."
        else
                if [[ $1 -lt 10 ]] ; then
                        echo "Sleeping for  $1 seconds at $(date +%H:%M:%S)."
                else
                        echo "Sleeping for $1 seconds at $(date +%H:%M:%S)."
                fi
        fi
        sleep $1
        echo "               Finished at $(date +%H:%M:%S)."
        echo
}

gap=10
mingap=3
for i in {1..20} ; do
        next=$(($(date +%s) + ${gap}))
        payload ${i}
        if [[ ${mingap} -ne 0 ]] ; then
                sleep ${mingap}
        fi
        while [[ $(date +%s) -lt ${next} ]] ; do
                sleep 1
        done
done
有效负载不是逻辑的一部分,它只是为了调试而存在的东西。你可以用你想要的任何东西来代替它。此外,for循环的
也是一个示例。您可以将其替换为无限循环,或者让脚本只进行(例如)60分钟的迭代,每小时
cron
启动一个脚本的新实例

下面是示例运行。您可以看到,负载每10秒运行一次(由于
睡眠
的变幻莫测,负载运行的时间为11秒),直到超过7秒。在这一点上,最小间隙开始起作用

Sleeping for  1 second  at 14:36:08.
               Finished at 14:36:09.

Sleeping for  2 seconds at 14:36:18.
               Finished at 14:36:20.

Sleeping for  3 seconds at 14:36:28.
               Finished at 14:36:31.

Sleeping for  4 seconds at 14:36:39.
               Finished at 14:36:43.

Sleeping for  5 seconds at 14:36:49.
               Finished at 14:36:54.

Sleeping for  6 seconds at 14:37:00.
               Finished at 14:37:06.

Sleeping for  7 seconds at 14:37:10.
               Finished at 14:37:17.

Sleeping for  8 seconds at 14:37:20.
               Finished at 14:37:28.

Sleeping for  9 seconds at 14:37:31.
               Finished at 14:37:41.

Sleeping for 10 seconds at 14:37:44.
               Finished at 14:37:54.

Sleeping for 11 seconds at 14:37:57.
               Finished at 14:38:08.

Sleeping for 12 seconds at 14:38:11.
               Finished at 14:38:23.

Sleeping for 13 seconds at 14:38:27.
               Finished at 14:38:40.

Sleeping for 14 seconds at 14:38:43.
               Finished at 14:38:57.

Sleeping for 15 seconds at 14:39:00.
               Finished at 14:39:15.

Sleeping for 16 seconds at 14:39:18.
               Finished at 14:39:34.

Sleeping for 17 seconds at 14:39:38.
               Finished at 14:39:55.

Sleeping for 18 seconds at 14:39:58.
               Finished at 14:40:16.

Sleeping for 19 seconds at 14:40:19.
               Finished at 14:40:38.

Sleeping for 20 seconds at 14:40:41.
               Finished at 14:41:02.

你的服务器脚本也是用php编写的吗?看起来像是重复的,可能是重复的,谢谢。请你能告诉我,在阅读了很多之后,我认为你的解决方案是最简单和完美的。不,不是。cron只允许您将时间安排到最近的一分钟,部分原因是它不能保证作业实际开始的时间,因此即使在一分钟内也会出现大量抖动。已经说过,任何类型的非交互式处理都应该是web应用程序的最后手段。如果您需要这种实时调度的准确性,那么不应该用PHP编写。甚至可能不在非实时操作系统上运行它。@symcbean当然,你是对的,但如果应用了适当的实用性,它在大多数用例中都能令人满意地工作。就我个人而言,我发现@Lie Ryan的答案和@Vegard Larsen的评论最合适。@symcbean,我的申请非常依赖于两次执行之间的最短时间,我计划将15秒减少到5秒。这就是为什么我选择了专用主机。顺便说一句,我只运行这个脚本。服务器详细信息为操作系统:Ubuntu Linux 10.04.1,CPU:Intel(R)Core(TM)2 Duo CPU E7500@2.93GHz 2核,RAM:2GB。请确保在此处设置了一些冗余。如果脚本失败(因为它最终会失败),请确保它每分钟由cron作业重新启动一次(如果它尚未运行)。你最多会丢失一分钟的数据。谢谢你的回复。这也是一个很好的解决方案,但我对服务器的性能没有信心。我认为最好在1分钟后运行cron并睡眠15秒。