Nor*_*ld2 13 php linux crontab
我创建了一个Email-Queue数据库表.我将插入我的PHP应用程序需要发送到此表的所有电子邮件.
然后,另一个PHP脚本将查找所有未发送的电子邮件并发送它们.
我使用cronjobs运行此脚本.不幸的是,cronjobs每分钟最多只能运行一次.因此,在最坏的情况下,用户必须等待一分钟,直到他的电子邮件真的要发送.
我目前的解决方法是使用addtional 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
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,脚本将每10秒运行一次.emails.php脚本的第一行是:
sleep($_REQUEST['sleep']);
Run Code Online (Sandbox Code Playgroud)
小智 15
这是我编写的一个简单的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
Run Code Online (Sandbox Code Playgroud)
Ish*_*Ish 13
这必须在脚本级别完成.
// 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
}
Run Code Online (Sandbox Code Playgroud)
对于初学者,我建议使用PHP的命令行版本而不是使用curl来调用脚本.然后,您可以创建一个具有合理生命周期的PHP脚本,该脚本不受必须在给定时间段内输出响应的限制.
因此,您可以在PHP脚本中简单地睡眠/检查电子邮件/传输/睡眠等,而不是不必要地使用cron.
另外,我要注意确保多个PHP脚本不能同时在数据库表上运行,可以使用pid文件或数据库设置方法(如果给定的文件/设置存在/设置,则中止处理或者通过在开始循环的"检查电子邮件"部分之前检查它运行了多长时间来明智地计时cron作业并限制脚本的最大处理时间.
| 归档时间: |
|
| 查看次数: |
16933 次 |
| 最近记录: |