Some performance optimizations for folder/file checking routines

This commit is contained in:
Andy Miller
2015-02-17 11:22:35 -07:00
parent 04a2f618bd
commit 7b32cbe2e1

View File

@@ -19,12 +19,13 @@ abstract class Folder
{
$last_modified = 0;
$directory = new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::SKIP_DOTS);
$iterator = new \RecursiveIteratorIterator($directory, \RecursiveIteratorIterator::SELF_FIRST);
$dirItr = new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::SKIP_DOTS);
$filterItr = new GravRecursiveFolderFilterIterator($dirItr);
$itr = new \RecursiveIteratorIterator($filterItr, \RecursiveIteratorIterator::SELF_FIRST);
/** @var \RecursiveDirectoryIterator $file */
foreach ($iterator as $file) {
$dir_modified = $file->getMTime();
foreach ($itr as $dir) {
$dir_modified = $dir->getMTime();
if ($dir_modified > $last_modified) {
$last_modified = $dir_modified;
}
@@ -33,6 +34,34 @@ abstract class Folder
return $last_modified;
}
/**
* Recursively find the last modified time under given path by file.
*
* @param string $path
* @return int
*/
public static function lastModifiedFile($path)
{
$last_modified = 0;
$dirItr = new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::SKIP_DOTS);
$filterItr = new GravRecursiveFileFilterIterator($dirItr);
$itr = new \RecursiveIteratorIterator($filterItr, \RecursiveIteratorIterator::SELF_FIRST);
/** @var \RecursiveDirectoryIterator $file */
foreach ($itr as $file) {
if ($file->isDir()) {
continue;
}
$file_modified = $file->getMTime();
if ($file_modified > $last_modified) {
$last_modified = $file_modified;
}
}
return $last_modified;
}
/**
* Get relative path between target and base path. If path isn't relative, return full path.
*
@@ -68,30 +97,7 @@ abstract class Folder
return $result ?: null;
}
/**
* Recursively find the last modified time under given path by file.
*
* @param string $path
* @return int
*/
public static function lastModifiedFile($path)
{
$last_modified = 0;
$dirItr = new \RecursiveDirectoryIterator($path);
$filterItr = new GravRecursiveFilterIterator($dirItr);
$itr = new \RecursiveIteratorIterator($filterItr, \RecursiveIteratorIterator::SELF_FIRST);
/** @var \RecursiveDirectoryIterator $file */
foreach ($itr as $file) {
$file_modified = $file->getMTime();
if ($file_modified > $last_modified) {
$last_modified = $file_modified;
}
}
return $last_modified;
}
/**
* Return recursive list of all files and directories under given path.
@@ -296,19 +302,22 @@ abstract class Folder
}
}
class GravRecursiveFilterIterator extends \RecursiveFilterIterator
class GravRecursiveFolderFilterIterator extends \RecursiveFilterIterator
{
public static $FILTERS = array(
'..', '.DS_Store'
);
public function accept()
{
// only accept directories
return $this->current()->isDir();
}
}
class GravRecursiveFileFilterIterator extends \RecursiveFilterIterator
{
public static $FILTERS = ['.DS_Store'];
public function accept()
{
return !in_array(
$this->current()->getFilename(),
self::$FILTERS,
true
);
// Ensure any filtered file names are skipped
return !in_array($this->current()->getFilename(), self::$FILTERS, true);
}
}