Php 如何每X分钟运行一次cronjob?

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"); ?> 但是我

我在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");
?>


但是我已经30分钟没有收到使用此配置的电子邮件了。

检查cronjob是否工作的两个步骤:

  • 与执行cronjob的用户一起登录服务器
  • 手动运行php命令:

    /usr/bin/php/mydomain.in/cromail.php


  • 并检查是否显示任何错误

    您正在将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