1
0
mirror of https://github.com/danog/file.git synced 2024-11-29 20:09:10 +01:00
file/lib/StatCache.php

88 lines
1.9 KiB
PHP
Raw Permalink Normal View History

<?php
2015-08-08 16:09:07 +02:00
namespace Amp\File;
use Amp\Loop;
2016-07-21 01:33:03 +02:00
class StatCache
{
2015-08-08 16:09:07 +02:00
private static $cache = [];
private static $timeouts = [];
private static $ttl = 3;
private static $now = null;
private static function init()
{
2015-08-08 16:09:07 +02:00
self::$now = \time();
2016-07-21 01:33:03 +02:00
$watcher = Loop::repeat(1000, function () {
2015-08-08 16:09:07 +02:00
self::$now = $now = \time();
foreach (self::$cache as $path => $expiry) {
if ($now > $expiry) {
unset(
self::$cache[$path],
self::$timeouts[$path]
);
} else {
break;
}
}
2016-07-21 01:33:03 +02:00
});
2016-07-21 01:33:03 +02:00
Loop::unreference($watcher);
Loop::setState(self::class, new class($watcher) {
private $watcher;
private $driver;
public function __construct(string $watcher)
{
$this->watcher = $watcher;
$this->driver = Loop::get();
}
public function __destruct()
{
$this->driver->cancel($this->watcher);
}
});
2015-08-08 16:09:07 +02:00
}
public static function get(string $path)
{
2015-08-08 16:09:07 +02:00
return isset(self::$cache[$path]) ? self::$cache[$path] : null;
}
public static function set(string $path, array $stat)
{
2015-08-08 16:09:07 +02:00
if (self::$ttl <= 0) {
return;
}
if (Loop::getState(self::class) === null) {
2015-08-08 16:09:07 +02:00
self::init();
}
2015-08-08 16:09:07 +02:00
self::$cache[$path] = $stat;
self::$timeouts[$path] = self::$now + self::$ttl;
}
public static function ttl(int $seconds)
{
self::$ttl = $seconds;
2015-08-08 16:09:07 +02:00
}
public static function clear(string $path = null)
{
2015-08-08 16:09:07 +02:00
if (isset($path)) {
unset(
self::$cache[$path],
self::$timeouts[$path]
);
} else {
self::$cache = [];
self::$timeouts = [];
}
}
}