如何更频繁地运行Cronjobs每分钟一次?

问题描述:

我创建了一个Email-Queue数据库表。我将插入我的PHP应用程序需要发送到此表中的所有电子邮件。如何更频繁地运行Cronjobs每分钟一次?

另一个PHP脚本会查找所有未发送的电子邮件并发送它们。

我使用cronjobs运行此脚本。不幸的是,cronjobs每分钟最多只能运行一次。 因此,在最坏的情况下,用户必须等待一分钟,直到他的电子邮件真的要发送。

我的解决方法,目前的想法是调用与addtional睡眠参数的脚本,并复制cronjobs。

实施例:

* * * * * curl emails.php?sleep=0 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=10 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=20 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=30 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=40 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=50 >/dev/null 2>&1 

在上述示例中,脚本将运行每隔10秒。 emails.php脚本的第一行是:

sleep($_REQUEST['sleep']); 
+1

superuser.stackexchange.com上可能会有更多知识渊博的人。 – EboMike 2011-01-12 18:21:07

对于初学者,我建议使用PHP的命令行版本而不是使用curl来调用脚本。然后,您可以创建一个具有合理生命周期的PHP脚本,而不必在给定时间段内输出响应。

因此,您可以然后只需睡在PHP脚本中的电子邮件/发送/睡眠等,而不是无谓地使用的cron /检查。

此外,我会小心确保多个PHP脚本不在同一时间在数据库表上操作,要么使用pid文件或数据库设置方法(如果给定文件/设置存在/是设置,中止处理),或者通过明智地计时cron作业并通过检查循环开始“检查电子邮件”部分之前运行多长时间来限制脚本的最大处理时间。

这必须在脚本级完成。

// cron.php running every 10 seconds 
// you need to setup this cron run every minute using `crontab` of cPanel etc 
<?php 

$expireTime = time() + 60; 
while (time() < $expireTime) { 
    // my php logic here 

    sleep(10); 
    // sleep for 10 seconds 
    // you may change the sleep time to change frequency 
} 

如果你这样做每隔10秒,cron是只是不适合这份工作的合适工具。你需要的是一个连续运行的脚本,如Ish所示。

您可以通过将一个根据开始注册脚本作为服务/停止脚本到/etc/init.d中并启用它。

或者如果您只有一个用户帐户,则可以在屏幕会话中运行它。然后您甚至可以观察输出以进行错误诊断。

下面是一个简单的bash脚本我已经写了可与crontab中被用于超过1分钟更频繁地运行。

,你可以将它保存为〜/斌/ runEvery.sh ,然后在crontab中写入这样的运行otherScript.sh每5秒:

*/1 * * * * ~/bin/runEvery.sh 5 otherScript.sh

这是脚本:

#!/bin/bash 

inputPeriod=$1 
runCommand=$2 
RUN_TIME=60 
error="no" 

if [ 'x'"$runCommand" != 'x' ] 
then 
    if [ 'x'$inputPeriod != 'x' ] 
    then 
     loops=$(($RUN_TIME/$inputPeriod)) 
     if [ $loops -eq 0 ] 
     then 
      loops=1 
     fi 

     for i in $(eval echo {1..$loops}) 
     do 
      $runCommand 
      sleep $inputPeriod 
     done 

    else 
     error="yes" 
    fi 
else 
    error="yes" 
fi 

if [ $error = "yes" ] 
then 
    echo "runEvery - runs a command every X seconds for a minute" 
    echo "Usage: runEvery.sh <# in seconds < 60> <command to run>" 
fi