diff --git a/src/daemon/PhutilDaemonOverseerModule.php b/src/daemon/PhutilDaemonOverseerModule.php --- a/src/daemon/PhutilDaemonOverseerModule.php +++ b/src/daemon/PhutilDaemonOverseerModule.php @@ -7,13 +7,17 @@ */ abstract class PhutilDaemonOverseerModule extends Phobject { + private $throttles = array(); + /** * This method is used to indicate to the overseer that daemons should reload. * * @return bool True if the daemons should reload, otherwise false. */ - abstract public function shouldReloadDaemons(); + public function shouldReloadDaemons() { + return false; + } /** @@ -32,4 +36,36 @@ ->execute(); } + + /** + * Throttle checks from executing too often. + * + * If you throttle a check like this, it will only execute once every 2.5 + * seconds: + * + * if ($this->shouldThrottle('some.check', 2.5)) { + * return; + * } + * + * @param string Throttle key. + * @param float Duration in seconds. + * @return bool True to throttle the check. + */ + protected function shouldThrottle($name, $duration) { + $throttle = idx($this->throttles, $name, 0); + $now = microtime(true); + + // If not enough time has elapsed, throttle the check. + $elapsed = ($now - $throttle); + if ($elapsed < $duration) { + return true; + } + + // Otherwise, mark the current time as the last time we ran the check, + // then let it continue. + $this->throttles[$name] = $now; + + return false; + } + }