我有一个文件“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会以页面自动刷新的方式执行文件吗?或者这不会发生,因为没有带浏览器的客户端?
如果元刷新无效,是否还有其他可能实现页面的刷新?
提前致谢!
答案 0 :(得分:11)
我担心这不起作用,因为它是一个刷新页面的浏览器功能。
问题:为什么不能将cron作业设置为每5分钟更频繁地运行一次?
如果没有其他选项,那么您可以创建自己的守护进程来更频繁地完成工作。
e.g。 你的php脚本可以:
例如:(通过变更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的答案,然后看一下:
答案 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等)