public function transform(StreamMetaData $metadata)
{
// Do not create a cache
if (!$this->cacheManager->getCacheDir()) {
return $this->processTransformers($metadata);
}
$originalUri = $metadata->uri;
$wasProcessed = false;
$cacheUri = $this->cacheManager->getCachePathForResource($originalUri);
// Guard to disable overwriting of original files
if ($cacheUri === $originalUri) {
return false;
}
$lastModified = filemtime($originalUri);
$cacheState = $this->cacheManager->queryCacheState($originalUri);
$cacheModified = $cacheState ? $cacheState['filemtime'] : 0;
if ($cacheModified < $lastModified || isset($cacheState['cacheUri']) && $cacheState['cacheUri'] !== $cacheUri || !$this->container->isFresh($cacheModified)) {
$wasProcessed = $this->processTransformers($metadata);
if ($wasProcessed) {
$parentCacheDir = dirname($cacheUri);
if (!is_dir($parentCacheDir)) {
mkdir($parentCacheDir, $this->cacheFileMode, true);
}
file_put_contents($cacheUri, $metadata->source, LOCK_EX);
// For cache files we don't want executable bits by default
chmod($cacheUri, $this->cacheFileMode & ~0111);
}
$this->cacheManager->setCacheState($originalUri, array('filemtime' => isset($_SERVER['REQUEST_TIME']) ? $_SERVER['REQUEST_TIME'] : time(), 'cacheUri' => $wasProcessed ? $cacheUri : null));
return $wasProcessed;
}
if ($cacheState) {
$wasProcessed = isset($cacheState['cacheUri']);
}
if ($wasProcessed) {
$metadata->source = file_get_contents($cacheUri);
}
return $wasProcessed;
}