IMO edubem's answer is the way to go, however you can do something like this:
if (sha1(serialize(Map('/path/to/directory/', true))) != /* previous stored hash */) { // directory contents has changed }
Or a more weak / faster version:
if (Size('/path/to/directory/', true) != /* previous stored size */) { // directory contents has changed }
Here are the functions used:
function Map($path, $recursive = false) { $result = array(); if (is_dir($path) === true) { $path = Path($path); $files = array_diff(scandir($path), array('.', '..')); foreach ($files as $file) { if (is_dir($path . $file) === true) { $result[$file] = ($recursive === true) ? Map($path . $file, $recursive) : $this->Size($path . $file, true); } else if (is_file($path . $file) === true) { $result[$file] = Size($path . $file); } } } else if (is_file($path) === true) { $result[basename($path)] = Size($path); } return $result; } function Size($path, $recursive = true) { $result = 0; if (is_dir($path) === true) { $path = Path($path); $files = array_diff(scandir($path), array('.', '..')); foreach ($files as $file) { if (is_dir($path . $file) === true) { $result += ($recursive === true) ? Size($path . $file, $recursive) : 0; } else if (is_file() === true) { $result += sprintf('%u', filesize($path . $file)); } } } else if (is_file($path) === true) { $result += sprintf('%u', filesize($path)); } return $result; } function Path($path) { if (file_exists($path) === true) { $path = rtrim(str_replace('\\', '/', realpath($path)), '/'); if (is_dir($path) === true) { $path .= '/'; } return $path; } return false; }
cacheobject subscribe to afileChanged($event,$fileName)event & have the submission script doSomeEventsApi::fileChanged($fileName). If not this, I'd recursively callfilemtimeand use a singular cache file & only re-run the recursive filemtime if it's been 5 minutes since the last search... or something.