Small tool to execute code every time a file (or folder) is modified.
composer require innmind/file-watch
use Innmind\FileWatch\{
Factory,
Stop,
};
use Innmind\Server\Control\ServerFactory;
use Innmind\TimeWarp\Halt\Usleep;
use Innmind\TimeContinuum\Clock;
use Innmind\IO\IO;
use Innmind\Url\Path;
use Innmind\Immutable\Either;
$watch = Factory::build(
ServerFactory::build(
Clock::live(),
IO::fromAmbientAuthority(),
Usleep::new(),
)->processes(),
Usleep::new(),
);
$count = $watch(Path::of('/to/some/file/or/folder'))(0, function(int $count, Continuation $continuation): Continuation {
// this function is called every time the file is modified
++$count;
if ($count === 42) {
// This will stop watching the folder for changes and return the count
return $continuation->stop($count);
}
// This will instruct to continue watching for changes and the value will be
// passed to this callable the next time it's called
return $continuation->continue($count);
})->match(
static fn(int $count) => $count, // always 42 as it's the stopping value
static fn(\Throwable $e) => throw $e,
);
Warning
The function may be called multiple times for a single change due to the way tail
and stat
works.