代码之家  ›  专栏  ›  技术社区  ›  caw

如何使基于php的cron作业更频繁地执行?

  •  1
  • caw  · 技术社区  · 15 年前

    我有一个文件” update.php “它执行一些mysql操作。cron作业每5分钟执行一次此文件。不幸的是,我无法更频繁地执行cron作业。

    所以我想我可以加上…

    <html>
    <head>
      <meta http-equiv="refresh"  content="2; URL=<?php echo $_SERVER['SCRIPT_NAME']; ?>" />
    </head>
    <body></body>
    </html>
    

    …到页面“ UpDATE.PHP “。cron会以页面自动刷新的方式执行文件吗?或者这不会因为没有带浏览器的客户端而发生吗?

    如果元刷新没有效果,是否还有其他可能实现页面的刷新?

    提前谢谢!

    6 回复  |  直到 12 年前
        1
  •  11
  •   Community kfsone    7 年前

    恐怕这行不通,因为这是一个刷新页面的浏览器功能。

    问题:为什么不能将cron作业设置为每5分钟运行一次?

    如果没有其他选项,那么可以创建自己的守护进程来更频繁地执行该任务。

    例如 您的php脚本可以:

    • 等60秒
    • (等;跑;再跑两次)
    • 出口

    例如:(通过 sshow 的代码)

    <?php
    
    $secs = 60;
    
    ignore_user_abort(true);
    set_time_limit(0);
    
    dostuff();
    sleep($secs);
    dostuff();
    sleep($secs);
    dostuff();
    sleep($secs);
    dostuff();
    sleep($secs);
    dostuff();
    
    ?>
    

    如果cron每5分钟运行一次此脚本,则此版本的脚本将保持驻留4分钟,并执行代码4次,这相当于每分钟运行一次。

    对于什么是cronjob,以及它是如何运行的,似乎有些混乱。

    cron 是一个后台程序,它位于后台,并按中指定的计划在shell中运行任务。 crontab S.

    每个用户都有一个crontab,还有一个系统crontab。

    每个用户的crontab都可以指定作为该用户运行的作业。

    例如:

    # run five minutes after midnight, every day
    5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
    # run at 2:15pm on the first of every month -- output mailed to paul
    15 14 1 * *     $HOME/bin/monthly
    # run at 10 pm on weekdays, annoy Joe
    0 22 * * 1-5    mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
    23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
    5 4 * * sun     echo "run at 5 after 4 every sunday"
    

    所以每五分钟跑一次:

    */5 * * * *     echo "This will be run every five minutes"
    

    或者每分钟跑步:

    * * * * *       echo "This will be run every minute"
    

    命令的输出通过电子邮件发送给crontab的所有者(或由mailto指定)。 这意味着如果你每分钟运行一个东西,它会每分钟给你发邮件,除非你确保所有正常的输出被抑制或重定向。

    这些命令作为crontab的所有者运行,而crontab与web服务器运行的脚本不同,后者以“nobody”用户(或类似用户)的身份运行(无论web服务器配置为以何种身份运行)。 如果cronjob正在写入web服务器运行的脚本应该访问的文件,那么这会使生活变得更加复杂。基本上,您必须确保权限保持正确。

    现在,我不确定这是你所指的系统。如果你的意思是别的 cronjob 那么,上述情况可能不适用。

    如果你想做一些你当前的主机不允许你做的事情,那么与其绕开限制,不如看看切换主机提供商怎么样?


    另一种方法是将脚本放在普通脚本位置,并让一些外部调度程序以您喜欢的任何频率对其运行wget。


    另一种选择是按需更新 vartec 的建议。但是这可能解决不了你的问题。

        2
  •  3
  •   sshow Darron Smith    15 年前

    我很肯定你能做到这一点:

    <?php
    
    $secs = 120;
    
    ignore_user_abort(true);
    set_time_limit(0);
    
    while (true)
    {
        // do something
    
        // Sleep for some time
        sleep($secs);
    }
    
    ?>
    

    编辑

    除非像道格拉斯描述的那样,否则每次重新启动服务器后都必须执行一次。

    更新

    记住道格拉斯·莱德的答案,然后看看这个:

    http://www.php.net/manual/en/function.ignore-user-abort.php

        3
  •  2
  •   markus    15 年前

    我要说的是,不要试图用php来实现这一点,更改crontab。如果你需要你的应用程序每分钟都做一个cronjob,而你的主机没有提供这个选项,你很可能已经超过了你的主机。给自己找一个每月20美元的vps主机(slicehost,servergrove)。

        4
  •  1
  •   Bob Aman    15 年前

    更新:根据新信息编辑。

    元刷新将不起作用,因为cronjob.de将使用实际上不读取页面内容的自动系统。没有浏览器,所以没有看到元刷新。

    你有两个选择。它们的恐怖程度不同。

    最好的选择是更改网络主机。一个好的网络主机将完全支持cron。但如果你需要接触cron,老实说,你可能无论如何都应该在vps主机上。很多主机都会反对每分钟运行一个cron任务,除非该任务只是快速更新某些内容并退出。但vps主机通常不会在意。slicehost提供vps服务器,每月仅需20美元。不推荐给以前没有根访问权限的用户。

    de的5分钟限制是构建一个循环,该循环将运行一个迭代、睡眠、运行另一个迭代,并在5分钟结束前重复所需的任意多次。然而,这种方法有两个主要问题。首先,如果您有一个持续4分钟的请求,那么您的webhost很可能会在请求完成之前终止它。第二,如果Web服务器配置不正确,这样的请求可能会阻止其他请求,阻止合法用户访问您的站点—他们会排队等待cronjob.de请求完成,然后才能完成请求。由于这个请求需要4-5分钟才能完成,在一分钟后被重复之前,他们可能只能每5分钟访问一次您的站点。我想这是不可取的。不幸的是,要知道你是否会遇到这些问题,唯一的办法就是问问你的网络主机。我不建议在询问之前尝试它,因为如果它出人意料地坏了,并开始影响服务器上的其他客户,他们可能不喜欢它。

    如果你幸运的话,他们甚至会愿意为你安排一份亲信工作。

        5
  •  0
  •   HM2K    15 年前

    您可以使用php调用脚本…

    <?php
    $script='/path/to/my/php/script.php';
    
    ignore_user_abort(1);
    set_time_limit(0);
    $php=exec('which php');
    while (1) {
        if (file_exists($script)) { exec($php.' '.$script); }
        else { file_get_contents($script); }
        sleep(2);
    }
    ?>
    

    你给$script的文件必须存在,否则它会认为是一个url。

    它应该能做到。

        6
  •  -2
  •   Steel Plume    15 年前

    你想做的是暗示用户交互,那么如果没有客户端进入你的“页面”呢?

    例如,servlets和ejb容器可以在容器启动时以编程方式执行您需要的操作,因此我认为对于php来说,实现“自动”类cronlike作业的唯一方法是在apache源代码中进行一些更改,显然只有在使用housing服务器的情况下。

    一个更实际的选项是,一些cron脚本可以直接调用在web服务器启动期间启动的页面(wget、netcat等)。