有一个非常简单易用的windows任务调度器。我认为您不会获得 10 秒乘 10 秒的分辨率。您很可能必须按每分钟安排一次。
您还可以安排一个任务调度程序(或 cron,对于 linux)项目来运行它,比如每分钟连续运行 3-4 次:
for($x = 0; $x < 4; $x++) {
yourFunction();
sleep(10);
}
因此,这样一来,您就有了一个每分钟执行 4 次的脚本,但并不是每 10 秒精确一次。请记住,如果您每 10 秒执行 6 次,这将超过 60 秒,因为您的脚本也需要时间来执行,并且您将有重叠。
如果你使用任务调度器方法或以上方法,我会写一个“锁”,这样如果任务调度器正在运行之前启动的检查脚本,辅助将永远不会运行,例如:
if(is_readable('is_running')) {
die("Already have one running");
}
file_put_contents('is_running', date('r'));
// at the end of the script, remove is_running since it won't be running anymore
unlink('is_running');
date('r') 因此,如果有任何问题,您可以通过在文本编辑器中打开锁来查看上次写入锁的时间。再一次,除非您非常精确地执行此操作,否则您最终可能会得到 (1) 一个除了每分钟运行一次的脚本,将有两个脚本在运行,可能会导致大量进程的缓慢雪崩 (2) 如果你使用锁,它可能每 10 秒运行一次,每隔一分钟运行一次,如果锁持续一眨眼时间超过 60 秒......(3)谁知道还有什么......这就是为什么在我的示例中,我建议每分钟运行 3-4 次,如果你真的需要每分钟运行一次以上,则间隔 10 秒。 (如果您的脚本需要相对较长的时间,这仍然会导致问题,所以再一次......)
另一种可能更容易出现问题的方法是在 Windows 服务器上使用长时间运行的 PHP 脚本,该脚本执行以下操作:
while(1) {
yourFunction();
sleep(10);
}
但是,这是不可靠的,因为进程会偶尔停止(死亡),您需要确保它在启动时启动,并且还要处理运行命令行脚本的黑匣子服务器上的时间。此外,在长时间运行的进程情况下,您可能还需要一个辅助脚本来检查它是否每分钟左右运行正常。
最后,我在将负载很重的服务器上使用了很多这种方法......例如,假设你知道你正在每 10 秒点击超过 1 次,您可以在 every php 脚本中引入概率(例如,作为包含,使用类似的东西):
if(mt_rand(1,100) < 10) {
yourFunction();
}
或者我在重负载站点上的首选方法是使用像 apc、redis 或 memcache 之类的内存存储(我已经在使用它,因为它是一个重负载站点)并简单地存储“上次运行”时间和如果超过 10 秒前,立即更新运行时间,然后运行函数,伪 ex:
if($yourStore->get('last_garbage_collection') < (time() - 10)) {
$yourStore->set('last_garbage_collection', time());
yourFunction();
}
上次运行时间也可以存储在 mySQL、Sessions(用于每个用户的垃圾收集、检查脚本等)或其他任何东西中。
因此,就 Windows 而言,确实没有一种伟大的方法可以做到这一点。我的建议毫无疑问是任务调度程序/cron 每分钟运行一次(你真的需要每 10 秒检查一次吗?),或者最后一个有垃圾收集时间的方法,如果你必须有 10 秒的分辨率,它是一个负载很重的网站,每秒有几十个请求,甚至更多,你是 em> 意识到这仍然可能不会一直运行、中断或更糟。