| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- <?php
- namespace think\swoole;
- use Swoole\Timer;
- use Symfony\Component\Finder\Finder;
- use Symfony\Component\Finder\SplFileInfo;
- class FileWatcher
- {
- protected $finder;
- protected $files = [];
- public function __construct($directory, $exclude, $name)
- {
- $this->finder = new Finder();
- $this->finder
- ->files()
- ->name($name)
- ->in(array_filter((array) $directory, function ($dir) {
- return is_dir($dir);
- }))
- ->exclude($exclude);
- }
- protected function findFiles()
- {
- $files = [];
- /** @var SplFileInfo $f */
- foreach ($this->finder as $f) {
- $files[$f->getRealpath()] = $f->getMTime();
- }
- return $files;
- }
- public function watch(callable $callback)
- {
- $this->files = $this->findFiles();
- Timer::tick(1000, function () use ($callback) {
- $files = $this->findFiles();
- foreach ($files as $path => $time) {
- if (empty($this->files[$path]) || $this->files[$path] != $time) {
- call_user_func($callback);
- break;
- }
- }
- $this->files = $files;
- });
- }
- }
|