FileWatcher.php 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. <?php
  2. namespace think\swoole;
  3. use Swoole\Timer;
  4. use Symfony\Component\Finder\Finder;
  5. use Symfony\Component\Finder\SplFileInfo;
  6. class FileWatcher
  7. {
  8. protected $finder;
  9. protected $files = [];
  10. public function __construct($directory, $exclude, $name)
  11. {
  12. $this->finder = new Finder();
  13. $this->finder->files()
  14. ->name($name)
  15. ->in($directory)
  16. ->exclude($exclude);
  17. }
  18. protected function findFiles()
  19. {
  20. $files = [];
  21. /** @var SplFileInfo $f */
  22. foreach ($this->finder as $f) {
  23. $files[$f->getRealpath()] = $f->getMTime();
  24. }
  25. return $files;
  26. }
  27. public function watch(callable $callback)
  28. {
  29. $this->files = $this->findFiles();
  30. Timer::tick(1000, function () use ($callback) {
  31. $files = $this->findFiles();
  32. foreach ($files as $path => $time) {
  33. if (empty($this->files[$path]) || $this->files[$path] != $time) {
  34. call_user_func($callback);
  35. break;
  36. }
  37. }
  38. $this->files = $files;
  39. });
  40. }
  41. }