private function tinifyDirectory($dir, $recursive, &$report) { if (!file_exists($dir)) { $this->logWarning($dir . ' does not exist', $report); return; } if ($recursive) { $Files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); } else { $Files = new FilesystemIterator($dir); } $extensions = array("png", "jpg", "jpeg"); $pictures = array(); foreach ($Files as $fileinfo) { if ($fileinfo->isFile() && in_array(strtolower($fileinfo->getExtension()), $extensions)) { $pictures[] = $fileinfo; } } $dirFileCounter = 0; $dirGainSize = 0; // Sort by size usort($pictures, function ($a, $b) { if ($a->getSize() == $b->getSize()) { return 0; } return $a->getSize() > $b->getSize() ? -1 : 1; }); foreach ($pictures as $fileinfo) { $object = new FileCache($fileinfo); if ($object->needTinify()) { set_time_limit(10); $filename = $object->getPathname(); $fileSize = $object->getSize(); $object->tinify(); $newFileSize = $object->getSize(); $gainSize = $fileSize - $newFileSize; $dirFileCounter++; $dirGainSize += $gainSize; $report->update($gainSize); if (isset($this->logger)) { $this->logger->logInfo('[' . $filename . '] ' . $fileSize . '=>' . $newFileSize . ' (' . (100 - (int) ($newFileSize * 100 / $fileSize)) . '%)'); } } } if (isset($this->logger)) { $this->logger->logInfo('[' . $dir . ']: ' . $dirFileCounter . ' files(s), gain: ' . (int) ($dirGainSize / 1024) . 'Ko'); } }