如何让我的基于PHP的cron作业更频繁地执行?

时间:2009-04-12 15:01:20

标签: cron refresh meta-tags

我有一个文件“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 个答案:

答案 0 :(得分:11)

我担心这不起作用,因为它是一个刷新页面的浏览器功能。

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

如果没有其他选项,那么您可以创建自己的守护进程来更频繁地完成工作。

e.g。 你的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();

?>

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

对cronjob是什么以及如何运行似乎有些困惑。

cron是一个守护程序,它位于后台,并按照crontab中指定的时间表通过shell运行任务。

每个用户都有一个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的用户身份运行,该用户与Web服务器运行的脚本形成对比,后者作为“nobody”用户运行(或类似 - 无论Web服务器配置为运行如何)。 如果cronjob正在写入应该由web服务器运行的脚本访问的文件,这会使生活变得更加复杂。基本上,您必须确保权限保持正确。

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

如果你想做一些当前主持人不允许你这样做的事情,那么你可能会考虑转换托管服务提供商而不是黑客攻击?


另一种方法是将脚本放在正常的脚本位置,让一些外部调度程序以你喜欢的频率运行wget。


另一种选择是按需更新vartec的建议形式。但是,这可能无法解决您的问题。

答案 1 :(得分:3)

我很确定你可以通过这样做来实现它:

<?php

$secs = 120;

ignore_user_abort(true);
set_time_limit(0);

while (true)
{
    // do something

    // Sleep for some time
    sleep($secs);
}

?>

修改

每次服务器重启后都必须执行一次,除非你像Douglas所描述的那样执行它。

<强>更新

记住Douglas Leeder的答案,然后看一下:

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

答案 2 :(得分:2)

我说不要尝试用php做这个,改变你的crontab。如果你需要你的应用程序每分钟做一个cronjob而你的托管不提供这个选项,你很可能已经超出你的托管。每月获得20美元的VPS主机(Slicehost,Servergrove)。

答案 3 :(得分:1)

更新:根据新信息进行编辑。

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

你有几个选择。它们或多或少都有可怕。

最好的选择是更改webhosts。一个好的webhost将完全支持cron。但是,如果你需要触摸cron,老实说,你应该在VPS主机上。很多主机都会反对每分钟运行一次的cron任务,除非任务只是快速更新并退出。但VPS主机通常不会关心。 Slicehost提供VPS服务器,每月只需20美元。不建议以前从未使用过root用户的人。

你得到的唯一选择是cronjob.de的5分钟限制是建立一个循环,它将运行迭代,睡眠,运行另一个迭代,并在5结束之前重复多次分钟。但是,这种方法存在两个主要问题。首先,如果您的请求持续4分钟,那么您的虚拟主机很可能会在请求完成之前终止该请求。其次,如果网络服务器配置不正确,这样的请求可能会阻止其他请求,阻止合法用户访问您的网站 - 他们会排队,等待cronjob.de请求完成,然后才能完成请求。由于该请求需要4-5分钟才能完成,在一分钟后重复之前,他们可能每5分钟只能访问一次您的网站。我猜这是不可取的。不幸的是,知道你是否会遇到这些问题的唯一方法就是问你的webhost。我不建议在询问之前尝试它,因为如果它出乎意料地糟糕并开始影响服务器上的其他客户,他们可能不会欣赏它。

如果你很幸运,他们甚至可能愿意为你设立一份cron工作。

答案 4 :(得分:0)

您可以使用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。

应该这样做。

答案 5 :(得分:-2)

您尝试做的事情意味着用户互动,那么如果没有客户进入您的“页面”会怎么样?

例如,Servlet和EJB容器可以在容器启动时以编程方式执行所需的操作,因此我认为对于PHP来说,完成“自动”cronlike作业的唯一方法是对Apache源代码进行一些更改,显然只有在你正在使用住房服务器。

不考虑代码更改的更可靠的选项可能是某些cron脚本直接调用您的Web服务器启动期间启动的页面(wget,netcat等)