Php 如何每X分钟运行一次cronjob?
我在cronjob中运行一个PHP脚本,我想每5分钟发送一次电子邮件 我的当前(crontab)cronjob: cronmail.php如下所示:Php 如何每X分钟运行一次cronjob?,php,cron,cron-task,Php,Cron,Cron Task,我在cronjob中运行一个PHP脚本,我想每5分钟发送一次电子邮件 我的当前(crontab)cronjob: cronmail.php如下所示: <?php $from = 'D'; // sender $subject = 'S'; $message = 'M'; $message = wordwrap($message, 70); mail("myemail@gmail.com", $subject, $message, "From: $from\n"); ?> 但是我
<?php
$from = 'D'; // sender
$subject = 'S';
$message = 'M';
$message = wordwrap($message, 70);
mail("myemail@gmail.com", $subject, $message, "From: $from\n");
?>
但是我已经30分钟没有收到使用此配置的电子邮件了。检查cronjob是否工作的两个步骤:
并检查是否显示任何错误您正在将cron设置为每小时运行10分钟。
要将其设置为每5分钟
,请在crontab
文件中更改为*/5****/usr/bin/php/mydomain.in/cronmail.php>/dev/null 2>&1
,字段为:
- 时刻表
- 一天中的一个小时
- 每月的第二天
- 每年的月份
- 一周中的哪一天
因此:
表示每小时10分钟后执行blah
如果您希望每五分钟使用一次,请使用:
*/5 * * * * blah
指每分钟但仅每五分之一,或:
0,5,10,15,20,25,30,35,40,45,50,55 * * * * blah
对于不理解*/x
符号的较旧的cron
可执行文件
如果在此之后它似乎仍然不起作用,请将命令更改为类似以下内容:
date >>/tmp/debug_cron_pax.txt
并监视该文件,确保每五分钟写入一次内容。如果是这样,那么您的PHP脚本就有问题了。如果没有,则说明您的cron
守护进程有问题。您的cron应该如下所示:
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
* * * * * minutetestcmd "2015-10-21 07:28:00" 42 && command
*/5****
当您需要测试CRON设置时,它非常有用
将输出导入日志文件可能是一个好主意,这样您就可以查看脚本是否也抛出了任何错误,因为您不会在终端中看到它们
还可以尝试在PHP文件的顶部使用shebang,这样系统就知道在哪里可以找到PHP。例如:
#/usr/bin/php
这样你就可以这样称呼整个事情了
*/5****php/path/to/script.php>/path/to/logfile.log
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
要设置x分钟,我们需要在第一个参数中设置x分钟,然后设置脚本的路径
15分钟
*/15 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
如果希望每隔n
分钟运行一次cron,根据n
的值,有几个可能的选项
n
除以60(1,2,3,4,5,6,10,12,15,20,30)
这里,通过使用/
符号,解决方案非常简单:
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
m-59/n * * * * command
在上面,n
表示值n
,m
表示小于n
或*
的值。这将在分钟m,m+n,m+2n,…
n
不除60
如果n
不除以60,则不能使用cron干净地进行此操作,但这是可能的。要做到这一点,您需要在cron中放置一个测试,该测试将检查时间。最好在查看UNIX时间戳时执行此操作,即自1970-01-01 00:00:00 UTC以来的总秒数。假设我们想在Marty McFly第一次到达Riverdale时开始运行该命令,然后每隔n
分钟重复一次
% date -d '2015-10-21 07:28:00' +%s
1445412480
对于在'2015-10-21 07:28:00'之后每隔42
nd分钟运行一次的cronjob,crontab如下所示:
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
* * * * * minutetestcmd "2015-10-21 07:28:00" 42 && command
将minutetestcmd
定义为
#/usr/bin/env bash
开始时间=$(日期-d“$1”+%s)
#返回UTC时间
现在=$(日期“+%s”)
#获取分钟数(使用整数除法以避免延迟)
分钟=$((现在-开始时间)/60))
#设模
模=2美元
#做测试
((现在>=starttime))&&((分钟%modulo==0))
备注:UNIX时间不受闰秒的影响
备注:cron
没有亚秒精度您的绝对路径可能不正确请建议我正确的路径我的php文件cromail.php进入根目录-mydomain.in/cromail.phpSometimes php cli不想工作,因为您没有在php.ini中设置当前时区,即使您不使用日期。是cromail.php
还是cromail.php
?cromail.php仅用于测试更新*/5****mydomain.in/cromail.php>/dev/null 2>&1未收到email@user3705511您忘记通过php运行它-缺少usr/bin/php
partadded*/5****usr/bin/php/mydomain.in/cronmail.php>/dev/null 2>&1,但仍然不接收email@user3705511*/5****/usr/bin/php/mydomain.in/cromail.php>/dev/null 2>&1
已更新但仍未收到电子邮件*/5****usr/bin/php/mydomain.in/cronmail.php>/dev/null 2>&1i update*/5****mydomain.in/cronmail.php>/dev/null 2>&1未收到电子邮件我也使用了这里提到的命令,但它不起作用,因为它后面有一个返回语句。请确保不要以return和注释结束语句,当创建新cron时,它会显示“crontab:installing new crontab”消息。i update*/5****mydomain.in/cronmail.php>/dev/null 2>&1未接收电子邮件您是否尝试过手动而不是通过cron运行脚本?问题实际上可能出在脚本本身。这并不是每x(15)分钟运行一次TAK。它在每一个小时后的x(1)分钟内运行。在我的系统上,m/n
符号似乎不起作用(Debian 9,Ubuntu 16.04)。只有*/n
起作用。例如,5/5
或4/10
给出错误:错误分钟;在syslog中读取/etc/crontab
时(在带有cron v.3.0pl1-128ubuntu2的Ubuntu中)。这个m/n符号是被放弃了,还是只在某些系统中可用?@mivk感谢您指出这一点。这对我来说是个错误。它应该读为m-59/n
。只有一个范围可以有步长。(请参见man 5 crontab
)。我已经更新了答案
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
* * * * * minutetestcmd "2015-10-21 07:28:00" 42 && command