public static function optimize($path)
{
$workingPath = $path;
if (!stream_is_local($path)) {
$workingPath = self::getTempFile();
copy($path, $workingPath);
}
$format = getimagesize($workingPath);
if (is_array($format) && array_key_exists("mime", $format)) {
$format = strtolower(str_replace("image/", "", $format["mime"]));
$optimizedFiles = [];
$supportedOptimizers = ["png" => ["pngcrush", "zopflipng", "pngout", "advpng"], "jpeg" => ["jpegoptim", "cjpeg"]];
if (isset($supportedOptimizers[$format])) {
foreach ($supportedOptimizers[$format] as $optimizer) {
$optimizerMethod = "optimize" . $optimizer;
$optimizedFile = self::$optimizerMethod($workingPath);
if ($optimizedFile && file_exists($optimizedFile)) {
$optimizedFiles[] = ["filesize" => filesize($optimizedFile), "path" => $optimizedFile, "optimizer" => $optimizer];
}
}
// order by filesize
usort($optimizedFiles, function ($a, $b) {
if ($a["filesize"] == $b["filesize"]) {
return 0;
}
return $a["filesize"] < $b["filesize"] ? -1 : 1;
});
// first entry is the smallest -> use this one
if (count($optimizedFiles)) {
copy($optimizedFiles[0]["path"], $path);
}
// cleanup
foreach ($optimizedFiles as $tmpFile) {
unlink($tmpFile["path"]);
}
if (!stream_is_local($path)) {
unlink($workingPath);
}
}
}
}