FileWatcher.php 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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. }