定期从服务器端调用函数?

时间:2012-11-29 20:49:47

标签: php javascript html asp-classic

有没有办法让服务器调用一些函数来检查我的数据库,看看某个值是否定期有效(每10秒)?

所以我不需要实际访问我的方面让javascript完成工作,服务器会每隔10秒自动调用一次函数吗?

2 个答案:

答案 0 :(得分:2)

Windows任务调度程序非常易于使用。我认为你不会得到10秒到10秒的分辨率。你很可能每分钟都要安排一次。

你也可以安排一个任务调度程序(或cron,for 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次,您可以在每个 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>意识到仍然可能无法一直运行,中断或更糟。

答案 1 :(得分:0)

有适用于Windows的第三方计划程序可以帮助您。这取决于您的Windows版本。几年前,我使用Autotask 2000运气好。不确定它是否适用于较新版本的Windows。