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

标签 php javascript html asp-classic

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

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

最佳答案

有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秒前,立即更新运行时间,然后运行该函数,伪e.x.:

if($yourStore->get('last_garbage_collection') < (time() - 10)) { 
    $yourStore->set('last_garbage_collection', time());
    yourFunction();
}

最后一次运行时间也可以存储在 mySQL、 session (用于每用户垃圾收集、检查脚本等)或其他内容中。

因此,就 Windows 而言,确实没有一种很好的方法来实现这一切。毫无疑问,我的建议是任务调度程序/cron 每分钟运行一次(您真的需要每 10 秒检查一次吗?),或者最后一个具有垃圾收集时间的方法,如果您必须具有 10 秒的分辨率,它一个负载很重的站点,每秒有数十个请求,或者始终更多,并且 em> 意识到仍然可能无法一直运行、中断或更糟。

关于php - 定期从服务器端调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13634473/

相关文章:

php - Android登录mysql数据库

php - CakePHP 与存储过程

php - 如何使用 mysql 数据库创建阻塞系统?

javascript - Laravel 6 中的 Ajax 删除给出 405(不允许的方法)

javascript - 在单个页面上动态加载多个 View

html - IE Flexbox justify-content center 溢出问题

javascript - 如何将javascript变量添加到div?

php - 从多行中选择

javascript - 如何排除Document click上的元素

javascript - Owl Carousel 需要导航悬停时的滚动效果