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

我创build了一个电子邮件队列数据库表。 我将插入我的PHP应用程序需要发送到这个表中的所有电子邮件。

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

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

我目前的解决方法是使用addtional sleep参数调用脚本并复制cronjob。

例:

* * * * * 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']); 

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

因此,您可以在PHP脚本中简单地休眠/检查电子邮件/传输/睡眠等,而不是不必要地使用cron。

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

下面是我写的一个简单的bash脚本,它可以和crontab一起使用,运行频率超过1分钟。

你可以把它保存为〜/ bin / runEvery.sh,然后在crontab中写下这样的内容,每隔5秒运行一次otherScript.sh:

*/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 

这必须在脚本级完成。

 // 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并启用它来将脚本注册为服务。

或者,如果您只有一个用户帐户,则可以在屏幕会话中运行它。 那么你甚至可以看输出的错误诊断。