Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何以每分钟一次以上的频率运行Cronjobs?_Php_Linux_Crontab - Fatal编程技术网

Php 如何以每分钟一次以上的频率运行Cronjobs?

Php 如何以每分钟一次以上的频率运行Cronjobs?,php,linux,crontab,Php,Linux,Crontab,我创建了一个电子邮件队列数据库表。我将把PHP应用程序需要发送的所有电子邮件插入此表 另一个PHP脚本将查找所有未发送的电子邮件并发送它们 我使用cronjobs运行这个脚本。不幸的是,cronjobs每分钟最多只能运行一次。 因此,在最坏的情况下,用户必须等待一分钟,直到他的电子邮件真正被发送 我目前的解决方案是使用附加的sleep参数调用脚本并复制cronjobs 例如: * * * * * curl emails.php?sleep=0 >/dev/null 2>&1

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

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

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

我目前的解决方案是使用附加的sleep参数调用脚本并复制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']);

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

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


此外,我会注意确保多个PHP脚本不会同时在数据库表上运行,可以使用pid文件或数据库设置方法(如果给定的文件/设置存在/设置,则中止处理)或者,在开始周期的“检查电子邮件”部分之前,通过检查cron作业的运行时间,合理地对cron作业进行计时,并限制脚本的最大处理时间。

这必须在脚本级别完成

// cron.php running every 10 seconds

<?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
}
//cron.php每10秒运行一次

如果每10秒执行一次,cron就不是适合此工作的工具。您需要的是一个脚本,它可以像Ish所示连续运行

通过将相应的启动/停止脚本放入/etc/init.d并启用它,可以将脚本注册为服务


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

下面是我编写的一个简单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
#/bin/bash
inputPeriod=$1
runCommand=$2
运行时间=60
error=“否”
如果['x'$runCommand”!='x']
然后
如果['x'$inputPeriod!='x']
然后
循环=$($RUN\u TIME/$inputPeriod))
if[$loops-等式0]
然后
循环=1
fi
对于$中的i(eval echo{1..$loops})
做
$runCommand
睡眠$inputPeriod
完成
其他的
error=“是”
fi
其他的
error=“是”
fi
如果[$error=“yes”]
然后
echo“runEvery-每X秒运行一个命令一分钟”
echo“用法:runEvery.sh”
fi
那么:

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

这是我刚刚想到的一些东西,它运行良好,这是我的php脚本:

$start = time();
$now = time();
while (($now - $start) < 55) {
  echo "do some work";
  sleep(5); // if you want
  $now = time();
}
$start=time();
$now=时间();
而(($now-$start)<55){
回声“做一些工作”;
睡觉(5);//如果你愿意
$now=时间();
}
这里的想法是循环,直到你已经跑了55秒。脚本将在下一分钟快结束时退出,此时cron将再次触发脚本

睡眠是可选的,当然可以是你认为适合你工作的任何数量

55秒的值也可以调整为小于55秒,以确保您不会滚动到下一分钟,然后运行两个版本。(也可以使用锁来确保不同时运行两个副本,但这是另一个问题)


希望这对某人有帮助。。我知道这是个老问题

superuser.stackexchange.com上可能有更多知识渊博的人。您想要的是一个php守护程序,而不是一个cron脚本https://crontab.guru/
,一个非常适合各种cron配置的网站。