1

我有一个文件“ 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 会以页面自动刷新的方式执行文件吗?还是因为没有带有浏览器的客户端而不会发生这种情况?

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

提前致谢!

4

6 回答 6

11

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

问题:为什么不能将 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();

?>

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

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

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

如果您想做一些当前主机不允许您做的事情,那么与其绕过限制,您可能会考虑更换托管服务提供商?


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


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

于 2009-04-12T15:19:04.273 回答
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

于 2009-04-15T20:59:40.827 回答
2

我会说不要尝试使用 php 执行此操作,请更改您的 crontab。如果您需要您的应用程序每分钟执行一次 cronjob,而您的主机没有提供此选项,那么您的主机很可能已经超出了您的要求。以每月 20 美元的价格为自己获得一个 VPS 主机(Slicehost、Servergrove)。

于 2009-04-15T20:15:48.763 回答
1

更新:根据新信息编辑。

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

你有几个选择。它们的可怕程度或多或少有所不同。

最好的选择是更改虚拟主机。一个好的虚拟主机将完全支持 cron。但是,如果您需要接触 cron,老实说,您可能无论如何都应该在 VPS 主机上。许多主机会反对每分钟运行的 cron 任务,除非该任务只是非常快速地更新某些内容并退出。但是 VPS 主机通常不会在意。Slicehost 以每月 20 美元的价格提供 VPS 服务器。不建议以前从未有过 root 访问权限的人使用。

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

如果你幸运的话,他们甚至可能愿意为你设置一个 cron 工作。

于 2009-04-15T19:53:38.287 回答
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。

它应该可以解决问题。

于 2009-04-16T23:02:58.820 回答
-2

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

例如,Servlet 和 EJB 容器可以在容器启动时以编程方式完成您需要的操作,所以我认为对于 PHP 而言,“自动”完成类似 cron 的作业的唯一方法是在 Apache 源代码中进行一些更改,显然只有在您使用住房服务器。

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

于 2009-04-12T15:18:51.467 回答