function staticCache($file, $line, $key, $callback = null) { if (!isset($callback)) { $callback = $key; $key = null; } static $map; if (!isset($map)) { $map = (object) array(); } if (isset($map->{"{$file}:{$line}-{$key}"})) { return $map->{"{$file}:{$line}-{$key}"}; } $cacheFile = $_SERVER['cachePath'] . '/' . substr(pathinfo($file, PATHINFO_FILENAME), 0, 10) . '__' . substr(preg_replace('/(?i)[^a-z0-9]+/', '', $key), 0, 10) . '__' . sha1("{$file}:{$line}-{$key}") . '.cache'; $cacheCorrelationFile = "{$cacheFile}.correlation"; if (version_development && is_file($cacheCorrelationFile)) { foreach (array_diff(unserialize(file_get_contents($cacheCorrelationFile)), includedFile()) as $file) { if (is_file($file)) { includedFile($file); } } } if (!is_file($cacheFile) || version_development && filemtime($cacheFile) < lastCodeChangeTimestamp()) { directory(dirname($cacheFile)); file_put_contents($cacheFile, serialize($callback())); file_put_contents($cacheCorrelationFile, serialize(includedFile())); } $map->{"{$file}:{$line}-{$key}"} = unserialize(file_get_contents($cacheFile)); return $map->{"{$file}:{$line}-{$key}"}; }
function codeChanged() { static $includedFiles = array(); static $result = true; $newIncludedFiles = includedFile(); if (count($includedFiles) != count($newIncludedFiles)) { $fingerprintFile = $_SERVER['cachePath'] . '/codeBase_' . sha1(serialize($newIncludedFiles)) . '.timestamp'; $result = !is_file($fingerprintFile) || codeTimestamp() > filemtime($fingerprintFile); if ($result) { directory(dirname($fingerprintFile)); $touchResult = touch($fingerprintFile); enforce($touchResult, "Could not touch '{$fingerprintFile}'"); } $includedFiles = $newIncludedFiles; } return $result; }