2

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

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

4

2 回答 2

2

有一个非常简单易用的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 次点击,你可以在每个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 秒的分辨率,它一个负载很重的站点,每秒有几十个请求,甚至更多,而且知道它可能仍然无法一直运行、中断或更糟。

于 2012-11-29T22:04:35.903 回答
0

有适用于 Windows 的第三方调度程序可以为您解决问题。这取决于您的 Windows 版本。几年前,我幸运地使用了 Autotask 2000。不确定它是否适用于较新版本的 Windows。

于 2012-12-01T21:18:11.930 回答